我在寫窗口服務。我有一套任務要每天執行一次。任何時間間隔後應該執行一些任務,例如5分鐘。最後一組任務應該在72小時的時間間隔後執行。爲窗口服務創建完美的多線程模型
同時我有一些設置需要刷新在一定的時間間隔。
我在正確設計時發現了一點問題。這是我的設計。
public void StartController()
{
try
{
readSettings();
startDetectionAndPost(); //once a day
LogUtil.WriteLog(LogLevel.INFO, "starting bootstrap");
bootStrap(); //based on time interval elapsed
LogUtil.WriteLog(LogLevel.INFO, "starting heartbeat of agent");
startHeartBeat(); //after a time interval say 1 min
LogUtil.WriteLog(LogLevel.INFO, "start fetching ADSI info");
startInfoTimer();
while (true)
{
if (!IsRunning)
{
engine.StopExecution();
break;
}
//here got to change this as per threading model.
while (_threadMonitor.CurrentThreadCount >= MAX_JOB_COUNT)
{
if (!IsRunning)
{
engine.StopExecution();
LogUtil.WriteLog(LogLevel.INFO, "query execution stopped");
break;
}
//otherwise sleep
Thread.Sleep(100);
}
_executionThread = new Thread(new ThreadStart(engine.StartExecution));
_threadMonitor.IncrementThread();
_executionThread.Start();
//if user gone stop service it will timeout issue.
Thread.Sleep(new TimeSpan(0, 0, 1));//_agentCache.DomainSweepInterval));
}
}
catch (Exception ex)
{
LogUtil.WriteLog(LogLevel.ERROR, "could not process."+ex.Message,ex);
//log exception and what to do next.
}
}
我每天必須執行一次任務,或每分鐘後都要執行一次心跳。我爲此創建了計時器並啓動它,因爲這些事情是獨立於其他人的。但那時主要執行部分。在哪裏我有兩種類型的查詢來執行。 1)每隔一段時間後說5分鐘,每隔72小時後再隔一段時間。一次只能執行一次。 2)我必須在給定的時間間隔刷新我的設置,例如5分鐘後,我必須刷新其他兩個設置,例如30分鐘後和其他60分鐘後。
現在我發現正確安排它有困難,以便我的服務啓動/停止不會受到影響,並且所有內容都應根據可伸縮性和性能進行完美設計?
請分享您的觀點,我希望我的問題被正確構思。
謝謝
如果您有需要按計劃運行的操作,請在Windows任務計劃程序中運行它們,而不是重新實施它。創建一個「標準」可執行文件,其中包含命令行參數並根據它們執行相應的任務,然後創建計劃任務以調用可執行文件來執行所述任務。 Windows服務不適合你在做什麼。 – Rob
我個人不喜歡這樣,因爲我在這裏的日程安排時間可以不斷變化。一個客戶說72小時,另一個客戶可以1小時。在這裏,每件事情都是動態的,並由服務器控制 – sunder
在這種情況下,創建一個管理窗口計劃任務的工具。讓您的用戶界面修改時間表,刪除不正確的任務,添加新任務並更新現有任務。編寫一個Windows服務來執行與Windows調度程序相同的工作是**硬**,更重要的是,*微軟已經爲你準備好了*。利用已有的功能=)如果你堅持創建一個服務,就不要有睡眠的線程,在適當的時候使用定時器來引發事件,通過爲每個需要的定時「活動」運行適當的代碼來做出反應執行。 – Rob