2012-06-27 69 views
0

我不知道如何正確命名問題。請免費做編輯。觸發12小時循環

我有一個後臺控制檯應用程序在我的服務器上運行。控制檯應用程序會不時發送電子郵件並執行一些小操作(每5分鐘一次)。

應用程序不是每5分鐘通過任務管理器啓動,它在安裝過程中打開一次,並且無限循環和thread.sleep保持運行。因此,我無法將任務管理器配置爲使用特定參數打開應用程序。

現在我需要添加一個任務來每12小時運行一次,並且我想使用相同的應用程序。該任務包括刪除並創建幾個文件,但檢查自上次創建以來基於文件日期是否有12個小時,每5分鐘對我來說看起來有點不明智。

是否有一個非常昂貴的方式(沒有數據庫,沒有日誌,沒有文件創建日期,沒有多線程)使用同一個應用程序打勾12小時循環?如果不是,那麼最好的辦法是什麼?

+3

行任務B.東西,你可能看http://quartznet.sourceforge.net/ – Blorgbeard

+0

或者你可以只記得你跑最後一次,並檢查如果是12小時前每次5分鐘的任務都會收起來。 – Blorgbeard

+0

有沒有考慮將其作爲服務運行?我知道它沒有回答你的問題 - 原始問題的選項 - 創建兩個線程 - 每個線程都有自己的計時器對象 - 併爲每個任務設置特定的計時器。如果做得正確 - 你可以隨後延長到第3 /第4。謹慎使用這兩個線程之間的共享資源。 – tsells

回答

1

這裏是在午夜UTC調度的有效手段,而不循環:

var now=DateTime.UtcNow; 
var today=now.Date; 
var tomorrow=today.AddDays(1); 
var dueTime=tomorrow-now; 

System.Threading.Timer timer = null; 
timer = new Timer(_ => { 
    try 
    { 
     //do your thing 
    } 
    finally 
    { 
     timer.Dispose(); 
    } 
},null,dueTime,TimeSpan.FromMilliseconds(-1d)) 
1

據我所知,你已經有一個循環,等待5分鐘,然後做任務A.現在你想添加任務B每12小時運行一次。我要麼用Timer對象替換它們,要麼在任務A運行時每5分鐘檢查一次,看看任務B運行了多久。如果其至少12小時,然後一起運行的

if (last12HourRun.Subtract(DateTime.Now).TotalHours > 12) 
    // run task B 
    last12HourRun = DateTime.Now;