2013-03-31 33 views
1

我主要被重用從舊時代的代碼片段運行一個後臺線程:我應該如何在C#> 4.0

public void Start() 
     { 
      renewalThread = new Thread(() => 
      { 

       while (!disposed) 
       { 
        Thread.Sleep(TimeSpan.FromSeconds(10)); 

        try 
        { 

         if (LogUpdated != null) 
          update(); 
        } 
        catch (Exception ex) 
        { 

        } 
       } 

      }); 
      renewalThread.Start(); 
     } 

是否有更優雅的方式來做到這一點,思考新的異步/等待的東西? 什麼是一個解決方案的主要區別做這樣的事情

Task.run(() => 
{ 
await Task.delay(10000); 

update code 
}, __.LongRunning); 
+2

我不會使用線程,我會使用'Timer'。 –

+0

你能否更新答案,告訴他爲什麼。 –

回答

4

使用Timer來代替:

aTimer = new System.Timers.Timer(10000); 

    aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 

    aTimer.Enabled = true; 

private static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
// do something here. 
// if this method could take longer than the intervale, disable the 
// timer at the start and re-enable at the end. 
} 

隨着Timer你沒有啓動一個新的線程。 Thread.Sleep強制您使用坐在並等待的線程。如果您希望每x秒執行一次操作,那麼System.Threading.Timer就是爲此設計的,它將採用線程池線程並在調用該事件時使用該線程,並且線程僅在事件期間使用 - 與Sleep不同。 Sleep是不準確的 - 它可能比您要求的時間少或更多。它在10秒內失效的可能性爲零;但它是不準確的。使用thread.Sleep意味着您不能同時執行兩個事件 - 如果您的Timer事件處理程序比時間間隔花費更多時間,它將一次運行兩個處理程序。 A Timer更容易停止 - 您只需撥打StopDispose即可。使用Thread.Sleep您必須使用Thread.Abort - 並且風險數據損壞(即您必須編寫調用Thread.Sleep的代碼,以取消線程不會損壞數據的方式)。如果您需要在事件中的UI線程上執行某些操作,請使用​​,並且您不必處理編組回到UI線程(例如Control.BeginInvoke)。

我可以繼續,但我認爲你明白了。有關更多詳細信息,請參見http://bit.ly/IhxHSk

相關問題