任务并行库替代BackgroundWorker?

84

任务并行库中是否有任何可替代或改进BackgroundWorker类的内容?

我有一个带向导式UI的WinForms应用程序,它执行一些长时间运行的任务。我想要一个可以响应的UI,具有标准进度条和取消操作的能力。我以前使用过BackgroundWorker来实现这一点,但我想知道是否有一些可以使用TPL模式代替的方式?


1
另请参阅https://dev59.com/y2855IYBdhLWcg3w-JXR和https://dev59.com/Kmct5IYBdhLWcg3wAo-H。 - nawfal
2个回答

92
Task类是对BackgroundWorker的改进;它自然支持嵌套(父/子任务),使用新的取消API,任务继续等。 我的博客中有一个示例,展示了旧的BackgroundWorker的做法和新的Task的做法。我为需要报告进度的任务编写了一个小助手类,因为我发现语法相当笨拙。该示例涵盖了结果值、错误条件、取消和进度报告。请保留原有的html标签格式。

很难在这个答案和Hatch的答案之间做出决定,因为他的答案在技术上是正确的。然而,你的博客展示了如何使用新的Task类,这正是我所需要的——从BackgroundWorker进化而来。我正在将你的例子作为我的应用程序代码的基础。 - Keith G
2
几天前,我写了一篇比较各种后台处理技术的文章BackgroundWorker具有更容易的进度报告,而Task允许嵌套。在这两者之间,我更喜欢Task(清理进度报告比允许嵌套要容易得多)。虽然它们都比其他常见解决方案先进得多。但是当我听到人们使用ThreadThreadPool.QueueUserWorkItem时,我感到非常不安,因为它们是最难正确使用的后台任务。 - Stephen Cleary
更简单的进度报告?只有当你想报告百分比时才是如此。报告其他任何内容都需要使用begininvoke或SynchronizationContext.Post,这很丑陋。 - Panagiotis Kanavos
5
你可以将任何任意对象作为“userState”传递。 然而,在我上次评论后的2.5年里,“Task”已经补充了"IProgress<T>"和"Progress<T>",它们比"BackgroundWorker"的进度更加清晰易用。在现代代码中,完全没有理由再使用"BackgroundWorker"了。 - Stephen Cleary
是的,我刚刚注意到了。不知何故,当我点击TPL标签查找新问题时,这篇帖子排在最前面! - Panagiotis Kanavos

23

后台工作者仍然是实现此目的的有效方法 - 如果您正在同时运行多个大型操作,则值得考虑并行扩展,如果只有一个操作,则建议使用后台工作者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接