2010-08-18 68 views
75

任務並行庫是否有任何可以被視爲對BackgroundWorker類的替代或改進?BackgroundWorker的任務並行庫替換?

我有一個嚮導式UI的WinForms應用程序,它執行一些長時間運行的任務。我希望能夠通過標準進度條獲得響應式用戶界面,並且能夠取消操作。我之前用BackgroundWorker完成了這個,但是我想知道是否有一些TPL模式可以用來代替?

+0

另請參閱http://stackoverflow.com/questions/4054263/how-does-c-sharp-5-0s-async-await-feature-differ-from-the-tpl和http://stackoverflow.com/questions/12414601/async-await-vs-backgroundworker – nawfal 2013-05-14 06:07:50

回答

87

Task類是對BackgroundWorker的改進;它自然地支持嵌套(父/子任務),使用新的API取消,任務延續等

I have an example on my blog,顯示出做事情和做事情的新方式Task的老BackgroundWorker方式。對於需要報告進度的任務,我確實有一個小的幫助類,因爲我覺得語法很尷尬。該示例涵蓋結果值,錯誤條件,取消和進度報告。

+0

由於他在技術上是一個正確答案,因此難以確定這一點和Hatch的答案。但是,您的博客展示瞭如何使用新的Task類,而這正是我期待的 - 從BackgroundWorker發展而來。我在您的應用程序中使用您的示例作爲代碼的基礎。 – 2010-08-25 17:54:16

+2

幾天前,我寫了一篇[各種後臺處理技術的比較](http://nitoprograms.blogspot.com/2010/08/various-implementations-of-asynchronous.html)。 'BackgroundWorker'具有更簡單的進度報告,而'Task'允許嵌套。在這兩者中,我更喜歡「任務」(清理進度報告比允許嵌套更容易)。儘管如此,它們還是比其他常見解決方案早了兩年。當聽到使用'Thread'或'ThreadPool.QueueUserWorkItem'的人時,我會畏縮。對於後臺任務來說,他們是最難正確使用的。 – 2010-08-26 03:25:23

+0

更簡單的進度報告?只有當你想報告一個百分比。報告其他事情需要begininvoke或SynchronizationContext.Post醜陋 – 2013-04-19 11:24:00

23

後臺工作者仍然是實現這一目標的有效方式 - 如果您同時運行多個大型操作,那麼並行擴展將值得考慮,如果它只是一個,那麼我會堅持使用後臺工作。

+2

Bgw將從改進的ThreadPool中獲益 – 2010-08-18 15:21:42