为什么使用Async/Await超过正常线程或任务?

Jam*_*ery 29 .net c#

我一直在阅读很多关于异步和等待的内容,起初我没有得到它,因为我没有正确理解线程或任务.但在掌握了两者之后,我想知道:async/await如果你对线程感到满意,为什么要使用?

异步/等待的异步可以通过线程信令Thread.Join()等完成.它仅仅是为了节省编码时间和"少"麻烦吗?

Kar*_*son 24

是的,它是一种语法糖,使得处理线程更容易,它也使代码更容易维护,因为线程管理是由运行时完成的.await立即释放线程并允许该线程或其他线程从中断处继续,即使在主线程上完成.

像其他抽象一样,如果你想完全控制封面下的机制,那么你仍然可以使用线程信号等自由地实现类似的逻辑.

如果您对查看async/await产生的内容感兴趣,可以使用Reflector或ILSpy来反编译生成的代码.

阅读async和await生成什么?有关C#5.0代表您做什么的描述.


usr*_*usr 16

如果等待只是调用Task.Wait我们就不需要特殊的语法和新的API.主要区别在于async/await在等待完成时完全释放当前线程.在异步IO期间,根本没有涉及线程.IO只是内核中的一个小数据结构.

async/await 在引擎盖下使用基于回调的等待并使其所有的肮脏(想想JavaScript回调......)都有所作为.

请注意,异步不只是将工作移动到后台线程(通常).它释放所有涉及的线程.


Ste*_*ary 11

比较asyncawait与线程比较就像比较苹果和管扳手.从10,000英尺看,它们可能看起来相似,但它们是针对非常不同问题的非常不同的解决方案

async并且await都是关于异步编程的; 具体来说,允许方法在等待某些操作时暂停.当方法暂停时,它将返回其调用者(通常返回一个任务,该方法在方法完成时完成).

我假设您熟悉线程,这是关于管理线程.与async世界上最接近线程的线程是Task.Run,它开始在后台线程上执行某些代码,并返回在该代码完成时完成的任务.

asyncawait经过精心设计,与线程无关.因此,它们在WPF/Win8/WinForms/Silverlight/WP应用程序的UI线程中运行良好,保持UI线程响应而不占用线程池资源.它们在ASP.NET等多线程场景中也能很好地工作.

如果你正在寻找一个很好的介绍async/ await,我在我的博客上写了一个链接到其他推荐阅读.


abh*_*hek 6

Threads和async/await功能之间存在差异.

考虑一种情况,您呼叫网络从网络获取一些数据.这里调用网络驱动程序的线程(可能在某个svchost进程中运行)会自行阻塞,并消耗资源.

在Async/await的情况下,如果调用不是网络绑定的,它会使用SynchronizationContext将整个调用包装回一个回调,它可以从外部进程获得回调.这将释放线程,并且线程可用于其他消费事物.

异步和并发是两回事,前者只是在异步模式下调用,而后者实际上是cpu绑定.当您需要并发时,线程通常更好.

我很久以前就写过一篇博客来描述这些功能. C#5.0 vNext - 新的异步模式