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

时间:2012-09-05 01:08:37

标签: c# .net async-await

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

  

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

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

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

4 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:3)

async / await不只是关于使用更多线程。这是关于更有效地使用你拥有的线程。当操作阻塞时,例如等待下载或文件读取,async / await模式允许您将该现有线程用于其他操作。编译器处理下面的所有魔法管道,使其更容易开发。

有关问题说明和http://msdn.microsoft.com/en-us/magazine/hh456401.aspx上的白皮书,请参阅http://www.microsoft.com/en-us/download/details.aspx?id=14058

答案 2 :(得分:2)

不是async和await关键字自己生成的代码,不是。它们创建在当前线程上运行的代码,假设它具有同步上下文。如果它没有那么你实际上得到了线程,但是没有充分理由使用该模式。 等待表达式,你在await关键字右侧写的内容会导致线程运行。

但是该线程通常不可观察,它可能是设备驱动程序线程。报告说它是通过I / O完成端口完成的。非常常见,I / O始终是使用等待的好理由。如果WinRT没有强制你,那就是async / await被添加的真正原因。

关于“拥有同步上下文”的说明。如果SynchronizationContext.Current属性不为null,则在线程上有一个。这几乎只是gui应用程序主线程的情况。此外,您通常担心延迟的唯一地方不会冻结您的用户界面。

答案 3 :(得分:1)

基本上它正在做的是当你运行async方法而没有用await调用它时是这样的:

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

  2. 如有必要,请暂停该方法,然后将其余部分暂停。

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

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

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

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