2014-02-12 58 views
3

好了,所以我一直對了Thread.Sleep,Task.Delay,的AutoResetEvent讀了...等有道推遲執行代碼在後臺工作

我看到很多的爭論,這因爲它使用取決於正在執行的任務。

我目前使用Thread.Sleep,並認爲我需要開始避免它,並使用更好的做法。

這是一個包含BackgroundWorker的客戶端應用程序。該工作人員每30分鐘運行一次以檢查Web服務的更新數據。

然後它更新位於MainWindow中的3個整型變量。這些對UI沒有任何作用。它們僅用於檢查正在運行的其他工作人員。

是一種比另一種更好的延遲方法嗎?

如果用戶退出應用程序,並且調用Application.Current.Shutdown(),它會繼續運行,直到Thread.Sleep完成,否則即使線程正在休眠,它也會退出嗎?

+2

爲什麼不使用反對睡眠/後臺工作定時器嗎? – Jason

+0

Dispatcher.BeginInvoke(DispatcherPriority.Background,...); –

回答

4

使用Task,await和CancellationTokenSource的組合可以在後臺運行,等待而不浪費線程,並取消。

喜歡的東西:

var cancel = new CancellationTokenSource(); 
App.OnShutdown += (s,e) => cancel.Cancel(); 
await Task.Delay(1000,cancel.Token); 
+0

這對於這種情況非常有意義。由於Task.Delay()本身使用計時器,並且取消令牌可以立即中止等待。 +1 – vendettamit