异步等待和线程

Rom*_*och 6 .net c# multithreading threadpool async-await

我正在async-await和任务一起工作,但我无法理解一件事:

异步任务是在单独的线程中执行的吗?

正如msdn所说(异步编程):

async和await关键字不会导致创建其他线程.异步方法不需要多线程,因为异步方法不能在自己的线程上运行.

但是在ThreadPool类(ThreadPool类)的描述中的注释:

使用线程池线程的操作示例包括:

当您创建Task或Task对象以异步执行某些任务时,默认情况下,该任务计划在线程池线程上运行.

所以,现在我不明白async任务是否使用单独的线程.请解释一下.谢谢.

Ren*_*ogt 7

一个Task并不一定代表一个额外的线程.

如果await是a Task,则将控制流返回给方法的调用者,直到"某人"将其设置Task为已完成.

如果你开始Task通过Task.Run()或Task.Factory.StartNew(),然后传递给这些调用的动作是在另一个线程上执行(不是新的,但是从一个线程池).


Kar*_*nas 6

简而言之,它可以在Task不同的Thread地方运行,也可以在调用方上运行Thread。只有当调用者没有资源运行另一个时,任务才会Thread从 a 中获取。当它有足够的资源来运行另一个(空闲模式)时,将在调用者上运行。ThreadPool ThreadTaskTaskThreadTask

与线程相比,Task 是一个更高级别的抽象——它代表一个并发操作,它可能有也可能没有线程支持。任务是组合的(您可以通过使用延续将它们链接在一起)。他们可以使用线程池来减少启动延迟,并且通过 TaskCompletionSource,他们可以利用回调方法在等待 I/O 绑定操作时完全避免线程。

资料来源:第 565 页“C# 5.0 in a Nutshell”,作者 Joseph Albahari、Ben Albahari。


Sco*_*ain 5

async/await 适用于Tasks(不完全是,它适用于“awaitables”,但只是说“Task”对于本次讨论来说已经足够接近了)。

任务代表“将在以后完成的工作单元”。该工作单元可以是通过 启动的线程池中的一个新线程Task.Run(,也可以是类似 的系统 IO 调用DbDataReader.ReadAsync(),或者可以由TaskCompletionSource.

我建议阅读 Stephen Cleary 的async 和 await 介绍以了解更多关于