Async/Await vs Threads

Rom*_*key 92 .net c#

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

  1. 可以Async/Await完全取代旧的使用方式 Threads吗?
  2. Async/Await能够做任何一个的Thread可以异步呢?
  3. 可以Async/Await只与像一些方法来使用WebClient.DownloadStringAsync或者我可以将任何同步方法,使其使用Async/Await和不阻塞主线程?

Han*_*ant 72

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

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

能做什么线程可以异步做什么?

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

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

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

  • 在现代C#方面,在外部API上实现异步回调的最佳方法是什么? (4认同)
  • 在最后一段中介绍,使用任务. (4认同)
  • 您能否扩展“一个线程可以做更多有用的事情。”?了解线程提供的“异步”不适合的功能会很有用。 (2认同)
  • 嗨汉斯,刚刚注意到您的这个出色答案,您应该澄清最后一段,但它不一定是一项任务,它可以是任何存在 GetAwaiter 实例或扩展方法并返回实现 INotifyCompletion 的对象的任何内容并有一个 IsCompleted bool 属性和一个返回等待结果的 GetResult 方法。不过这个问题可能太技术性了,我只是想提一下。 (2认同)

wRA*_*RAR 13

关于此的正式声明.虽然你应该在盲目地用别人替换之前理解线程和异步编程之间的差异.

  • 此答案仅包含文档的链接.由于链接可能会过时,答案可能会过时 - 甚至更糟 - 完全没用.我们鼓励Stack的用户将链接的相关部分直接发布到他们的问题中. (2认同)

小智 5

我是这样想的(我认为微软也是这样做的,如果你看看https://learn.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2012/hh191443(v=vs.110 )#线程)

Async/await 是在主应用程序线程上运行某些代码的快速方法,其优点是代码可以在没有工作要做时自行挂起并将焦点返回到主线程,当有工作时在主线程上“唤醒”是要获得的结果,然后将处理传递回 - 你猜对了 - 主线程。将其视为 Basic 中基于事件的 GOTO 语句,可以将控制来回传递到特定的执行行。

相反,线程是一个单独的执行流,可以使用自己的变量等运行。如果有足够的硬件,执行与主线程并行发生。

如果您有一个 GUI 应用程序要下载单个文件,然后在下载后对该文件执行某些操作 - 我将使用 async/await 方法来实现它。

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