繁体   English   中英

异步方法不需要额外的线程?

[英]Async methods don't require additional threads?

在MSDN中,有一个这样的段落:

async和await关键字不会导致创建其他线程。 异步方法不需要多线程,因为异步方法不能在自己的线程上运行。 该方法在当前同步上下文上运行,并仅在方法处于活动状态时在线程上使用时间。 您可以使用Task.Run将CPU绑定的工作移动到后台线程,但后台线程无助于只等待结果可用的进程。

但看起来我需要对粗体文本提供更多帮助,因为我不确定它究竟意味着什么。 那么如何在不使用Threads情况下变为async

资料来源: http//msdn.microsoft.com/en-us/library/hh191443.aspx

有许多异步操作不需要使用多个线程。 像异步IO这样的东西通过中断来工作,这些中断在数据可用时发出信号。 这允许您进行不使用额外线程的异步调用 - 当信号发生时,操作完成。

Task.Run可用于创建自己的基于CPU的异步方法,这些方法将在其自己的单独线程上运行。 该段旨在表明这不是唯一的选择。

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调用它是这样的:

  1. 启动方法并尽可能地同步执行。

  2. 必要时,暂停方法并将其余部分放入延续中。

  3. 当异步部分完成(不再等待)时,安排继续在同一个线程上运行。

  4. 无论你想要什么,都可以正常运行在这个线程上。 您甚至可以检查/操作从异步方法返回的Task

  5. 当线程可用时,它将运行您的方法的其余部分。

“异步部分”可以是文件IO,Web请求或几乎任何内容,只要调用代码可以等待此任务完成即可。 这包括但不限于单独的线程。 正如Reed Copsey所指出的,还有其他方法可以执行异步操作,例如中断。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM