gpt4 book ai didi

c# - async 和 await 关键字不会导致创建额外的线程?

转载 作者:IT王子 更新时间:2023-10-29 04:16:58 25 4
gpt4 key购买 nike

我很困惑。一个或多个 Task 如何在单个线程上并行运行?我对并行的理解显然是错误的。

我无法理解 MSDN 的一些内容:

The async and await keywords don't cause additional threads to be created. Async methods don't require multithreading because an async method doesn't run on its own thread. The method runs on the current synchronization context and uses time on the thread only when the method is active.

.. 和:

Between starting a task and awaiting it, you can start other tasks. The additional tasks implicitly run in parallel, but no additional threads are created.

最佳答案

它们不是并行运行,而是轮流运行。当正在运行的 Task 的进度被阻止时,它会存储其状态并将控制权交给就绪的 Task。这是协作式多任务处理,而不是真正的并行性。

线程按照示例原则运行。但是,我想强调几个关键区别。

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

  • 任务不会看到不同的线程 ID
  • 当任务产生时,线程本地存储不会自动进行上下文切换。

其次,行为上的差异:

  • async/await 使用协同多任务,Win32 线程使用抢占。因此,所有阻塞操作都必须使用 async/await 模型明确地让出控制权。因此,您可以通过对未编写为 yield 的函数进行阻塞调用来最终阻塞整个线程及其所有任务。
  • 任务不会在多处理系统上并行执行。由于重入是受控的,这使得保持数据结构的一致性变得更加容易。

正如 Stephen 在评论中指出的那样,如果您使用多线程同步上下文,您可以在多个操作系统线程中同时执行(以及所有的复杂性和潜在的竞争条件)。但是 MSDN 引用的是关于单线程上下文的情况。

最后,在其他地方使用了相同的设计范例,您可以通过研究以下内容学到很多关于 async/await 的良好实践:

  • Win32 Fibers(使用与线程相同的调用方式,但协作)
  • Win32 重叠 I/O 操作,Linux aio
  • 协程

关于c# - async 和 await 关键字不会导致创建额外的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13993750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com