任务并行库替换BackgroundWorker?


83

任务并行库中是否有任何东西被认为是对BackgroundWorker类的替代或改进?

我有一个带有向导式UI的WinForms应用程序,它执行一些长期运行的任务。我希望能够拥有一个带有标准进度条的响应式UI,并能够取消该操作。我之前使用BackgroundWorker做到了这一点,但是我想知道是否可以使用某些TPL模式来代替?


Answers:


91

Task下课的改善BackgroundWorker; 它自然支持嵌套(父/子任务),使用新的取消API,任务继续等。

我的博客上有一个示例,展示了旧BackgroundWorker的做事方式和新Task的做事方式。我确实有一个小的帮助程序类,用于需要报告进度的任务,因为我觉得语法很尴尬。该示例涵盖了结果值,错误条件,取消和进度报告。


很难在此和Hatch的答案之间做出选择,因为从技术上来说,他是正确的答案。但是,您的博客显示了如何使用新的Task类,而这正是我一直在寻找的-来自BackgroundWorker的改进。我将您的示例用作应用程序中代码的基础。
基思·G

2
几天前,我写了各种后台处理技术比较BackgroundWorker具有更容易的进度报告,同时Task允许嵌套。在这两个,我更喜欢Task(这是很多容易清理进度报告而不是允许嵌套)。但是,它们都比其他常见解决方案快了几年。当我听到有人使用Thread或时,我会感到畏缩ThreadPool.QueueUserWorkItem。它们绝对是最难正确使用的后台任务。
Stephen Cleary 2010年

进度报告更容易?仅当您要报告百分比时。报告其他内容需要begininvoke或SynchronizationContext.Post丑陋
Panagiotis Kanavos 2013年

5
@PanagiotisKanavos:您可以将任意对象传递为userState。但是,自从我上次发表评论以来的2.5年中,Task已经对IProgress<T>和进行了补充Progress<T>,它们比BackgroundWorker的过程更干净,更容易。在现代代码中,根本没有理由再使用BackgroundWorker
Stephen Cleary 2013年

是的,我刚刚注意到。不知何故,当我单击TPL标签以查找新问题时,这篇文章排在第一位!
Panagiotis Kanavos

23

后台工作程序仍然是实现此目的的一种有效方法-如果您同时运行多个大型操作,那么并行扩展将值得考虑,如果只是并行扩展,那么我将坚持使用后台工作程序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.