在 MSDN 中有这样一段话:
async 和 await 关键字不会导致创建额外的线程。异步方法不需要多线程,因为异步方法不在其自己的线程上运行。该方法在当前同步上下文上运行,并且仅在该方法处于活动状态时才使用线程上的时间。您可以使用 Task.Run 将受 CPU 限制的工作转移到后台线程,但后台线程对等待结果可用的进程没有帮助。
但看起来我需要更多关于粗体文本的帮助,因为我不确定它的确切含义。那么它怎么会变成async
不使用Threads
呢?
在 MSDN 中有这样一段话:
async 和 await 关键字不会导致创建额外的线程。异步方法不需要多线程,因为异步方法不在其自己的线程上运行。该方法在当前同步上下文上运行,并且仅在该方法处于活动状态时才使用线程上的时间。您可以使用 Task.Run 将受 CPU 限制的工作转移到后台线程,但后台线程对等待结果可用的进程没有帮助。
但看起来我需要更多关于粗体文本的帮助,因为我不确定它的确切含义。那么它怎么会变成async
不使用Threads
呢?
有许多异步操作不需要使用多个线程。诸如异步 IO 之类的事情是通过在数据可用时发出信号的中断来工作的。这允许您进行不使用额外线程的异步调用 - 当信号发生时,操作完成。
Task.Run
可用于创建自己的基于 CPU 的异步方法,这些方法将在自己的单独线程上运行。然而,该段落旨在表明这不是唯一的选择。
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 始终是使用 await 的好理由。如果 WinRT 还没有强迫您,那么添加 async/await 的真正原因。
关于“具有同步上下文”的说明。如果 SynchronizationContext.Current 属性不为空,则线程上有一个。这几乎只发生在 gui 应用程序的主线程上。也是您通常担心延迟不会冻结您的用户界面的唯一地方。
async
本质上,当您运行一个方法而不调用它时,它所做的是await
:
启动该方法并尽可能同步执行。
必要时,暂停该方法并将其其余部分继续。
当异步部分完成(不再等待)时,安排继续在同一个线程上运行。
你想要的任何东西都可以在这个线程上正常运行。您甚至可以检查/操作Task
从异步方法返回的内容。
当线程可用时,它将运行您的方法的其余部分。
“异步部分”可以是文件 IO、Web 请求或几乎任何东西,只要调用代码可以等待此任务完成即可。这包括但不限于单独的线程。正如 Reed Copsey 所指出的,还有其他方法可以执行异步操作,例如中断。