在.Net 4.5中,Microsoft添加了新Async/Await
功能以简化异步编码.但是,我想知道
Async/Await
完全取代旧的使用方式
Threads
吗?Async/Await
能够做任何一个的Thread
可以异步呢?Async/Await
只与像一些方法来使用WebClient.DownloadStringAsync
或者我可以将任何同步方法,使其使用Async/Await
和不阻塞主线程?Han*_*ant 72
它可以完全取代使用Threads的旧方法吗?
不可以.线程可以做更多有用的事情.Await专门用于处理花费时间的事情,最常见的是I/O请求.传统上,当I/O请求完成时,回调就完成了.编写依赖于这些回调的代码非常困难,等待大大简化它.
能做什么线程可以异步做什么?
大致.等待处理延迟,它不执行任何线程所做的事情.await 表达式,即await关键字右侧的内容,是完成工作的原因.理想情况下,它根本不使用线程,它会发布驱动程序请求,一旦驱动程序完成数据传输,它就会生成完成通知回调.网络是迄今为止最常见的用法,数百毫秒的延迟是常见的,并且服务从桌面或局域网转移到"云"中是不可避免的副作用.同步使用此类服务会使UI完全没有响应.
只能用于某些方法,如WebClient.DownloadStringAsync
不可以.您可以将它与任何返回任务的方法一起使用.XxxxAsync()方法只是.NET框架中预先生成的方法,用于需要时间的常见操作.就像从Web服务器下载数据一样.
小智 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 线程在执行转移以处理下载文件时可能会冻结。