![](/img/trans.png)
[英]The async and await keywords don't cause additional threads to be created?
[英]Async methods don't require additional threads?
在MSDN中,有一个这样的段落:
async和await关键字不会导致创建其他线程。 异步方法不需要多线程,因为异步方法不能在自己的线程上运行。 该方法在当前同步上下文上运行,并仅在方法处于活动状态时在线程上使用时间。 您可以使用Task.Run将CPU绑定的工作移动到后台线程,但后台线程无助于只等待结果可用的进程。
但看起来我需要对粗体文本提供更多帮助,因为我不确定它究竟意味着什么。 那么如何在不使用Threads
情况下变为async
?
资料来源: http : //msdn.microsoft.com/en-us/library/hh191443.aspx
async / await不只是关于使用更多线程。 这是关于更有效地使用你拥有的线程。 当操作阻塞时,例如等待下载或文件读取,async / await模式允许您将该现有线程用于其他操作。 编译器处理下面的所有魔法管道,使其更容易开发。
有关问题描述和白皮书,请访问http://msdn.microsoft.com/en-us/magazine/hh456401.aspx , 网址为http://www.microsoft.com/en-us/download/details.aspx?id= 14058
不是async和await关键字自己生成的代码,不是。 它们创建在当前线程上运行的代码,假设它具有同步上下文。 如果它没有那么你实际上得到了线程,但是没有充分理由使用该模式。 await表达式 ,你在await关键字右侧写的内容会导致线程运行。
但是该线程通常是不可观察的,它可能是设备驱动程序线程。 报告说它是通过I / O完成端口完成的。 非常常见,I / O始终是使用等待的好理由。 如果WinRT没有强制你,那就是async / await被添加的真正原因。
关于“具有同步上下文”的说明。 如果SynchronizationContext.Current属性不为null,则在线程上有一个。 这几乎只是gui应用程序主线程的情况。 此外,您通常担心延迟的唯一地方不会冻结您的用户界面。
基本上它正在做的是当你运行async
方法而不用await
调用它是这样的:
启动方法并尽可能地同步执行。
必要时,暂停方法并将其余部分放入延续中。
当异步部分完成(不再等待)时,安排继续在同一个线程上运行。
无论你想要什么,都可以正常运行在这个线程上。 您甚至可以检查/操作从异步方法返回的Task
。
当线程可用时,它将运行您的方法的其余部分。
“异步部分”可以是文件IO,Web请求或几乎任何内容,只要调用代码可以等待此任务完成即可。 这包括但不限于单独的线程。 正如Reed Copsey所指出的,还有其他方法可以执行异步操作,例如中断。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.