Async/Await vs Threads

本文关键字:Threads vs Await Async | 更新日期: 2023-09-27 18:01:35

在。net 4.5中,微软增加了新的Async/Await特性来简化异步编码。然而,我想知道

  1. Async/Await能完全取代旧的使用方式吗Threads ?
  2. Async/Await能做Thread能做的事吗异步?
  3. Async/Await只能与WebClient.DownloadStringAsync等方法一起使用,或者我可以转换任何同步方法,使其使用Async/Await而不阻塞主线程吗?

Async/Await vs Threads

它能完全取代使用线程的旧方式吗?

。线程可以做更多有用的事情。Await是专门设计用来处理占用时间的事情的,最典型的是I/O请求。传统上,这是在I/O请求完成时通过回调完成的。编写依赖于这些回调的代码是相当困难的,await极大地简化了它。

能够做任何线程可以异步做的事吗?

。Await只负责处理延迟,它不做线程所做的任何事情。await 表达式,在await关键字的右边,是完成工作的东西。理想情况下,它根本不使用线程,它发布一个驱动程序请求,一旦驱动程序完成数据传输,它就生成一个完成通知回调。到目前为止,网络是最常见的用法,数百毫秒的延迟是常见的,并且是服务从桌面或局域网转移到"云"时不可避免的副作用。同步使用这些服务会使UI非常无响应。

只能在WebClient等方法中使用。DownloadStringAsync

。您可以将它与任何返回Task的方法一起使用。XxxxAsync()方法只是. net框架中为耗时的常见操作预先准备的方法。比如从web服务器下载数据

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

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

相比之下,线程是一个独立的执行流,可以带着自己的变量等运行,在给定足够的硬件条件下,执行与主线程并行。

如果你有一个GUI应用程序要下载一个文件,然后在下载后对该文件做一些事情-我会使用async/await方法实现它。

然而,如果你的GUI需要下载5000个文件-我会创建一个文件下载线程来处理,因为主GUI线程可能会冻结,而执行被转移到处理下载文件。