2009-07-09 130 views
2

如果我有一個Windows服務需要每30秒執行一次任務,這是更好使用; Timer()類或執行任務的循環會休眠幾秒鐘?Windows服務計劃執行

class MessageReceiver 
{ 
    public MessageReceiver() 
    { 
    } 

    public void CommencePolling() 
    { 
     while (true) 
     { 
      try 
      { 
       this.ExecuteTask();  
       System.Threading.Thread.Sleep(30000); 
      } 
      catch (Exception) 
      { 
       // log the exception 
      } 
     } 
    } 

    public void ExecutedTask() 
    { 
     // do stuff 
    } 
} 

class MessageReceiver 
{ 
    public MessageReceiver() 
    { 
    } 

    public void CommencePolling() 
    { 
     var timer = new Timer() 
      { 
       AutoReset = true, 
       Interval = 30000, 
       Enabled = true 
      }; 

     timer.Elapsed += Timer_Tick;  
    } 

    public void Timer_Tick(object sender, ElapsedEventArgs args) 
    { 
     try 
     { 
      // do stuff 
     } 
     catch (Exception) 
     { 
      // log the exception 
     } 
    } 
} 

windows服務將創建一個MessageReciever類的實例,並在新線程上執行CommencePolling方法。

+2

看起來像http://stackoverflow.com/questions/1099516/for-a-windows-service - 這是一個更好的等待旋轉或一個定時器,我發現通過搜索「服務計時器」。 – 2009-07-09 07:11:22

回答

4

發現我認爲這真的取決於你的需求。

情況1. 假設你想運行從12:00 AM this.ExecuteTask()每五分鐘開始(即,12:00,12:05,...),並假設的this.ExecuteTask()的執行時間變化(例如,從30秒到2分鐘),也許使用timer而不是Thread.Sleep()似乎是一個更簡單的方法(至少對我來說)。

但是,您也可以使用Thread.Sleep()來實現此行爲,同時通過在線程喚醒和this.ExecuteTask()完成時獲取時間戳來計算偏移量。

情況下2. 假設你想在接下來的5分鐘只是this.ExecuteTask()完成後要執行的任務,使用Thread.Sleep()似乎更容易。再次,您可以通過計時器來實現此行爲,同時每次重置計時器,同時計算每次this.ExecuteTask()完成時的偏移量。

注1,爲1的情況下,你應該在以下情況下非常小心:如果什麼this.ExecuteTask()有時需要比周期以上(即它開始於12:05和上面完成的例子12:13) 。

  1. 這對您的應用程序意味着什麼?它將如何處理?

    a。完全失敗 - 中止服務或在12:10中止當前(12:05)執行並啓動12:10執行。 b。沒什麼大不了的(跳過12:10一個,在12:15運行this.ExecuteTask())。

    c。沒什麼大不了的,但需要在12:05任務結束後立即啓動12:10執行(如果持續時間超過5分鐘,該怎麼辦?)。 d)。即使12:05執行正在運行,也需要啓動12:10執行。

    e。還要別的嗎?

  2. 對於上面選擇的策略,您選擇的實現(計時器還是Thread.Sleep())可輕鬆支持您的策略?

注2。有幾個定時器可以在.NET中使用。請看下面的文檔(儘管它有點老化,但它似乎是一個好的開始):Comparing the Timer Classes in the .NET Framework Class Library

0

在十秒鐘的等待期間你還在做什麼嗎?使用Thread.sleep會阻止,阻止你做其他事情。從性能角度來看,我不認爲你會看到太多差異,但我會避免使用Thread.sleep。

有三個定時器可供選擇 - System.Windows.Forms.Timer在主線程上實現,而System.Timers.Timer和System.Threading.Timer正在創建單獨的線程。

0

我相信這兩種方法是等價的。無論哪種方式都會有一個線程:要麼是因爲您創建了一個線程,要麼是因爲實現Timer類的庫創建了一個線程。

使用Timer類可能在資源方面稍微便宜一些,因爲實現定時器的線程也可能監視其他超時。