BackgroundWorker与异步/等待


17

我是C#开发的新手,希望创建一个响应更快的UI。在我的初步研究中,我看到了两种实现此目的的方法:

  1. 与BackgroundWorker类结合使用多线程。
  2. 较新的异步/等待修饰符。

更新意味着更好吗?两种方法有什么区别?如果我想创建一个新项目,如何选择哪种方法?

编辑:也许我应该指定。我正在创建一个Windows Forms应用程序,其中所有必需的数据都将保存/加载到本地磁盘上。我还将与多个USB设备通信。


Answers:


10

您将可以使用完成任务BackgroundWorker。这是一门众所周知的课程,许多人已经使用过它。

新的C#5 asyncawait关键字基本上使编写可读的异步代码更加容易。可能会有更少的教程和示例来说明如何使用这些关键字而不是来完成各种任务BackgroundWorker

除非您需要使用旧版本的C#,否则建议您学习如何使用asyncawait


14

asyncawait关键字不会让你的应用程序对自己的反应更灵敏。它们仅使返回Task对象的方法的调用和处理更加方便。为了使async/ await实际使用后台线程,您将需要结合使用以下内容:

  • Task.Start()-使用开始指定的任务TaskScheduler
  • PLINQ-并行执行一系列操作,返回一个Task。
  • TaskCompletionSource-处理异步任务的自定义方式。我使用它的一个地方是处理来自WebBrowser控件的事件。
  • 其他async方法,例如Win 8 API中的许多功能。

换句话说,async/ await基于任务的异步模式的扩展。您可以在此处找到大量信息,包括许多示例。

BackgroundWorker是一个WinForms组件,它使用基于事件的异步模式创建1个后台线程,并且您可以在DoWork事件处理程序中使用自己的代码填充在此后台线程上完成的工作。通常,Microsoft不再建议使用此模式(请参阅此处的页面底部),尽管如果您已经熟悉它,它仍然可能是一个简单的选择。

未提及的另一个选择是.NETReactive Extensions。这是另一个为应用程序添加响应能力的出色框架。


当您说Win 8 API时,是否表示Windows 7(我的目标平台)对Async功能的支持不佳?
robert.ecot13年

1
Robert,您好,Win 8 .NET API(适用于“ Metro”样式的应用程序)使用异步,并且需要等待大量时间,从文件I / O到显示对话框。在其他.NET组件(例如FileStream)中,您还可以将async / await与Stream.ReadAsync之类的方法一起使用。因此,在Win 8之外也有一些支持。
凯文·麦考密克

太好了,也感谢您提供的更新链接!非常有帮助。
robert.ecot13年

1
我在该页面上没有看到任何表明BackgroundWorker特别推荐的内容。
Kyralessa

我还建议阅读Async VS BackgroundWorker和有关Stephen C#中C#中并发编程系列博客文章,这是O'Reilly出版的全名书的作者。
sendenza 2016年

3

我想说的是async- await比灵活得多BackgroundWorker。如果你想要做的东西,千篇一律BackgroundWorker,你可以做到这一点async- await也与更具可读性,更类型安全的代码。

正因为如此,我认为你应该更喜欢使用async- awaitBackgroundWorker

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.