2011-01-21 100 views

回答

19

A BackgroundWorker是一個可以在WinForms中使用的類,允許您在後臺線程上執行任務,避免凍結UI,此外還允許您輕鬆地在主線程上編組成功回調的執行,用結果更新用戶界面的可能性。它還可以跟蹤進度並取消任務。它使用線程池中的線程。

另一方面,Thread是一個類,允許你簡單地執行一個新的thread一些任務。這是一個更基本的概念。

1

BackgroundWorker已經實現了報告進度,完成和取消的功能 - 所以你不需要自己實現它。 線程的使用使您可以更好地控制異步進程執行(例如,線程優先級或選擇前臺/後臺線程類型)。

順便說一句,有時你不需要進度報告和其他BackgroundWorker的東西 - 所以Thread/ThreadPool將是很好的選擇。

1

BackgroundWorker使用ThreadPool中的線程,使用Thread創建自己的線程。此外,在調用線程的事件報告方面還有一些設施。

+0

+1用於提及ThreadPool – spender 2011-01-21 09:34:17

1

BackgroundWorker是一個線程實現,它允許您分配一個要完成的方法。

它爲您提供了一個通信API,允許您停止工作,跟蹤進度以及異步通知。

1

使用BackgroundWorker - 它無論如何封裝線程和更簡單的工作。其優點之一是它的api允許更簡單的基於事件的模型報告進度,並進一步,這些事件調用被正確路由到UI線程(這樣你就不必使用Invoke方法編組調用)。

7

儘管BackgroundWorker class不是從Thread類派生而來,但它使您能夠管理線程比自己創建和調用線程更容易的工作。

它提出了三個重要事件:

  • DoWork - 提出的線程啓動時。
  • ProgressChanged - 向主UI線程報告進度。
  • RunWorkerCompleted - 線程完成時引發。

通過這些,您可以在調用RunWorkerAsync()啓動它之後監視線程正在執行的工作。

+0

BackgroundWorker封裝線程?你在說什麼 - 有封裝委託,它是異步調用的。 – 2011-01-21 09:45:32

0

我覺得有一個很大的不同,那就是當你想在BackgroundWorker調用的方法中使用任何UI組件時,它根本不起作用。我的意思是BackgroundWorker真的是一個後臺進程,你將無法使用界面操作。例如,如果您在由BackgroundWorker調用的方法中創建新標籤,那麼您肯定會遇到錯誤。