要创建的异步伺机关键字不会造成额外的线程?(The async and await keywords

2019-07-17 12:03发布

我糊涂了。 怎么能一个或多个Task并行地在一个单独的线程上运行? 我并行的认识显然是错误的。

MSDN的我不能绕到我的头位:

异步和等待关键字不会导致创建额外的线程。 异步方法不需要多线程,因为异步方法不会在自己的线程中运行。 该方法对当前同步上下文运行,并使用时间,只有当该方法是激活的线程上。

..和:

开始任务,等待它之间,你就可以开始其他任务。 其他任务并行运行含蓄,但创建额外的线程。

Answer 1:

他们不并行运行,他们轮流。 当被阻止运行任务的进展,它存储的状态,收益率控制到一个准备好的任务。 这是合作多任务,而不是真正的并行。

线程对样品原理。 不过也有,我想强调几个关键的不同之处。

首先,仅仅是因为async / await是没有操作系统的线程:

  • 任务将无法看到不同的线程ID
  • 线程本地存储是不会自动的上下文切换时任务的产量。

其次,在行为差异:

  • async / await使用合作多任务,Win32的线程使用优先购买权。 因此,它是必要的,所有的阻塞操作使用明确得到控制async / await模式。 所以,你可以结束封锁整个线程,并通过使阻塞调用不写入产生功能的所有任务。
  • 任务将无法并行多处理系统上执行。 由于重入被控制,这使得保持数据结构一致轻松许多。

斯蒂芬在评论中指出,你可以在多个操作系统线程同时执行(连同所有的复杂性和潜在的竞争条件下),如果你使用一个多线程的同步上下文。 但MSDN报价大约在单线程上下文情况。

最后,在其他地方使用此相同的设计模式,你可以学到很多好的做法async / await通过研究这些:

  • Win32的纤维 (使用相同的呼叫风格线程,但合作)
  • Win32的重叠I / O操作,Linux的AIO
  • 协同程序


文章来源: The async and await keywords don't cause additional threads to be created?