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

时间:2013-08-18 12:13:28

标签: c# .net

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

async / await的异步可以通过线程信令或Thread.Join()等来完成。它仅仅是为了节省编码时间而且#34;更少"麻烦?

5 个答案:

答案 0 :(得分:24)

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

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

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

阅读What does async & await generate?,了解C#5.0代表您所做的事情。

答案 1 :(得分:16)

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

async/await使用基于回调的等待,并使其所有的肮脏(想想JavaScript回调......)走了一条路。

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

答案 2 :(得分:11)

asyncawait与线程进行比较就像比较苹果和管道扳手一样。从10000英尺开始它们可能看起来相似,但它们是针对不同问题的非常不同的解决方案。

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

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

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

如果您正在寻找一个好的intro to async/await, I wrote up one on my blog,其中包含其他建议阅读的链接。

答案 3 :(得分:6)

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

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

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

Asynchrony和Concurrency是两个不同的东西,前者只是在异步模式下调用某些东西,而后者实际上是cpu绑定的。当你需要并发时,线程通常会更好。

我很久以前就写过一篇博客来描述这些功能。 C# 5.0 vNext - New Asynchronous Pattern

答案 4 :(得分:4)

async/await 使用线程;这是一个很大的优势。它使您的应用程序保持响应,而不会增加线程中固有的复杂性和开销。

目的是在处理长时间运行的I / O密集型操作时,使应用程序保持响应变得容易。例如,如果您必须从网站下载大量数据或从磁盘读取文件,那就太棒了。在这些情况下,启动新线程(或多个线程)是过度的。

一般规则是在处理CPU绑定操作时通过Task.Run使用线程,在处理I / O绑定操作时使用async/await

Stephen Toub在async/await上有一个很棒的blog post我建议您阅读。