2010-12-22 22 views

回答

9

BackgroundWorker

BackgroundWorker的類允許您在一個單獨的,專門的線程運行的操作。

Delegate

代表是一種類型,它定義一個方法簽名。 ...委託用於將方法作爲參數傳遞給其他方法。


的使用哪一個的問題無關與效率。

BackgroundWorker是一個簡化線程工作的包裝,您也可以使用異步委託,但正確管理它們要困難得多。或者,從MSDN:

當你想要一個負責任的UI,你都面臨着這樣的操作有關,BackgroundWorker的類提供了一個方便的解決方案長的延遲。

2

的後臺工作主要是爲了你需要輕鬆地運行在後臺線程任務,並在屏幕上提供進度更新UI的工作。

一個優點是它執法官其回調爲你的UI線程,所以你並不需要檢查InvokeRequired等

委託是傳遞函數作爲參數更通用的機制,並通過執行他們自己異步給你一個在另一個線程上運行這些方法的簡單方法。

1

後臺工作人員是一個抽象幫助您在單獨的線程上執行操作。

代表並不真正開始單獨的線程 - 它們是引用方法的類型。

但是你可能感興趣的是當你應該使用異步方法,而不是使用後臺工作。我在這方面沒有太多經驗,但是Anders Hejlsberg talked about it some in his PDC session on the Future of C#

我得到的消息是,在某些情況下,由於較低的複雜性,異步方法會更可取。 UI線程仍然會被阻塞,但不會長時間地影響它。

+1

BackgroundWorker使用線程池,它不創建它自己的線程。 – Paolo 2010-12-22 19:41:00

3

我有一個BackgroundWorker,異步委託和其他方法on my blog(從做後臺操作的角度)的簡要比較。

BackgroundWorker具有以下優點:

  • 進展報告很容易。任何BackgroundWorkerWorkerSupportsProgress財產是真實的可能會報告進度。 DoWork代表可能會調用ReportProgress,這會導致ProgressChanged事件觸發。
  • 有一個內置的協作取消系統。取消線程首先調用BackgroundWorker.CancelAsync。這會導致BackgroundWorker.CancellationPending屬性變爲true。代表應該監視該屬性(定期檢查),並將DoWorkEventArgs.Cancel設置爲true,並在操作被取消時返回。代表RunWorkerCompleted通過檢查RunWorkerCompletedEventArgs.Cancelled來檢測到取消結果。
  • 同步是自動完成指示和進度報告。 ProgressChangedRunWorkerCompleted事件與RunWorkerAsync被調用時的SynchronizationContext同步。

異步委託具有這樣的優勢:

  • 返回的值是簡單的;它只是返回。

總之,我推薦使用Task<TResult>而不是BackgroundWorker或異步委託。