Async / Await vs Threads

时间:2013-03-01 01:23:49

标签: c# .net

在.Net 4.5中,Microsoft添加了新的Async/Await功能,以简化异步编码。但是,我想知道

  1. Async/Await可以完全取代旧的使用方式 Threads
  2. Async/Await是否能够执行Thread所能做的任何事情 异步?
  3. Async/Await只能用于WebClient.DownloadStringAsync之类的某些方法,还是可以转换任何同步方法以使其使用Async/Await而不是阻止主线程?

3 个答案:

答案 0 :(得分:65)

  

它可以完全取代使用Threads的旧方法吗?

没有。线程可以做更多有用的事情。 Await专门用于处理花费时间的某事,最常见的是I / O请求。传统上,当I / O请求完成时,回调就完成了。编写依赖于这些回调的代码非常困难,等待大大简化它。

  

能够执行Thread可以异步执行的操作吗?

粗略。等待处理延迟,它不执行任何线程所做的事情。等待表达式,await关键字右侧的内容是完成工作的原因。理想情况下,它根本不使用线程,它会发布驱动程序请求,一旦驱动程序完成数据传输,它就会生成完成通知回调。网络是迄今为止最常见的用法,数百毫秒的延迟是常见的,并且服务从桌面或局域网转移到“云”中是不可避免的副作用。同步使用此类服务​​会使UI完全没有响应。

  

只能用于某些方法,如WebClient.DownloadStringAsync

没有。您可以将它与任何返回Task的方法一起使用。 XxxxAsync()方法只是.NET框架中预先生成的方法,用于需要时间的常见操作。就像从Web服务器下载数据一样。

答案 1 :(得分:12)

The official statement on this.虽然你应该在盲目地用别人替换之前理解线程和异步编程之间的区别。

答案 2 :(得分:0)

我是这样想的(如果您查看https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2012/hh191443(v=vs.110)#threads,我也认为Microsoft也是如此)

异步/等待是一种在主应用程序线程上运行某些代码的快速方法,其优势在于,代码可以在没有工作要做时挂起自身并将焦点返回到主线程,从而在主线程上“唤醒”当有结果要获取时,线程将处理返回给主线程(您猜对了)。可以将其视为Basic中基于事件的GOTO语句,该语句可以将控制来回传递给特定的执行行。

相反,线程是一个独立的执行流,可以使用自己的变量等运行。在给定足够硬件的情况下,执行与主线程并行发生。

如果您有一个GUI应用程序,该应用程序将下载一个文件,然后在下载文件时对其进行处理-我将使用async / await方法来实现。

但是,如果您的GUI需要下载5000个文件-我将创建一个文件下载线程来处理该问题,因为在执行转移以处理文件下载时,主GUI线程可能会冻结。