2012-05-10 53 views
1

我在寫窗口服務。我有一套任務要每天執行一次。任何時間間隔後應該執行一些任務,例如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分鐘後。

現在我發現正確安排它有困難,以便我的服務啓動/停止不會受到影響,並且所有內容都應根據可伸縮性和性能進行完美設計?

請分享您的觀點,我希望我的問題被正確構思。

謝謝

+7

如果您有需要按計劃運行的操作,請在Windows任務計劃程序中運行它們,而不是重新實施它。創建一個「標準」可執行文件,其中包含命令行參數並根據它們執行相應的任務,然後創建計劃任務以調用可執行文件來執行所述任務。 Windows服務不適合你在做什麼。 – Rob

+0

我個人不喜歡這樣,因爲我在這裏的日程安排時間可以不斷變化。一個客戶說72小時,另一個客戶可以1小時。在這裏,每件事情都是動態的,並由服務器控制 – sunder

+4

在這種情況下,創建一個管理窗口計劃任務的工具。讓您的用戶界面修改時間表,刪除不正確的任務,添加新任務並更新現有任務。編寫一個Windows服務來執行與Windows調度程序相同的工作是**硬**,更重要的是,*微軟已經爲你準備好了*。利用已有的功能=)如果你堅持創建一個服務,就不要有睡眠的線程,在適當的時候使用定時器來引發事件,通過爲每個需要的定時「活動」運行適當的代碼來做出反應執行。 – Rob

回答

0

首先我同意任務計劃程序有它的問題。之前我必須寫下其中之一,但是我從頭開始考慮這個項目。

http://taskschedulerengine.codeplex.com/

這使你爬了其他開發人員的背部,你可以專注於企業的實際問題。此外,如果您發現要添加的內容,則可以返回到社區

+0

我自己解決了這個問題,但我仍然會尋找一些專業人士提供他們的意見。我稍後會發布我的代碼。 – sunder