【发布时间】:2017-06-13 19:55:23
【问题描述】:
来自https://msdn.microsoft.com/en-us/library/mt674882.aspx#Threads:
基于异步的异步编程方法优于 几乎所有情况下的现有方法。特别是这种方法 在 IO 绑定操作方面优于 BackgroundWorker,因为 代码更简单,您不必防范竞争条件。 结合Task.Run,异步编程优于 BackgroundWorker 用于 CPU 密集型操作,因为异步编程 将运行代码的协调细节与工作分开 Task.Run 转移到线程池。
在我看来,async 函数链最终必须以等待程序无法控制的事情发生而告终。一些 Internet 下载或用户输入等。
如果您的程序必须执行一些冗长的计算,情况会怎样?它必须在一个本身不使用await 的方法中,因为当它自己完成所有工作时,没有什么可等待的。如果不使用await,那么控制就不会返回到调用函数,对吗?如果是这样,那么它肯定根本就不是异步的。
似乎BackgroundWorker 非常适合进行冗长的计算:https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx#Examples
有没有办法使用async/await 来达到这个目的?
【问题讨论】:
-
BackgroundWorker使用可以转换为几个或单个Task,然后您可以等待它们。 -
我开始写答案,但意识到答案对于论坛来说太长太宽泛了。但简而言之:异步编程的概念可能有点难以理解。在许多情况下,人们可以从异步编程中受益,但不是全部。 GUI 是一个完美的例子,其中异步编程工作得非常好。国际象棋,没那么多。我建议您阅读有关该主题的更多文献以更深入地了解。
-
没有等待的异步实际上只是同步
-
Sani,我每天都在阅读更多的文学作品,但我仍然没有看到这个问题得到解决。为什么异步编程不适用于国际象棋?
标签: c# asynchronous async-await backgroundworker