C# 异步等待和线程

C# 异步等待和线程,c#,.net,multithreading,async-await,threadpool,C#,.net,Multithreading,Async Await,Threadpool,我正在处理async wait和任务,但我不能理解一件事: 异步任务是否在单独的线程中执行? 正如msdn所说(): async和await关键字不会导致创建其他线程。异步方法不需要多线程,因为异步方法不在自己的线程上运行 但是在ThreadPoolclass()描述中的备注中: 使用线程池线程的操作示例包括: 当创建任务或任务对象以异步执行某些任务时,默认情况下,任务计划在线程池线程上运行 所以,现在我不明白async任务是否使用单独的线程。请给我解释一下。谢谢。async/await工作在(

我正在处理
async wait
和任务,但我不能理解一件事:

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

正如msdn所说():

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

但是在
ThreadPool
class()描述中的备注中:

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

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

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

async/await工作在(不完全是,它工作在“awaitables”上,但是仅仅说“Task”就足够了,可以讨论这个问题)

任务代表“稍后将完成的工作单元”。该工作单元可以是通过
Task.Run(
)启动的线程池中的一个新线程,也可以是类似于系统IO调用的线程,也可以是由线程池中的事件触发的线程


我建议阅读Stephen Cleary的书来了解更多关于的知识,用一个简单的术语来说
任务可以运行在不同的
线程上,也可以运行在调用方
线程上。当调用方
线程
不运行时,任务将只从
线程池
获取
线程当调用者
线程
有足够的资源运行另一个
任务
(空闲模式)时,将在调用者
线程
上运行另一个
任务
的ave资源

与线程相比,任务是一个 更高层次的抽象它代表了一个并发操作,可能是,也可能不是 由线程支持。任务是组合的(您可以通过 他们可以使用线程池来减少启动延迟,以及 通过TaskCompletionSource,他们可以利用回调方法避免 在等待I/O绑定操作时,所有线程都将被删除


资料来源:Joseph Albahari,Ben Albahari的第565页“简而言之,C#5.0”。

a
任务
不一定代表额外的线程

如果
等待
任务
,则将控制流返回给方法的调用方,直到“某人”将
任务
设置为已完成


如果通过
Task.Run()
Task.Factory.StartNew()
启动
任务
,则传递给这些调用的操作将在另一个线程上执行(不是新线程,而是来自线程池的线程)。

这一解释是错误的。“线程加载,”不管是什么,都不能确定新任务将在当前线程还是其他线程上执行。@Gserg能否提供不同意的来源?此问题的答案、此问题(,)中链接到的问题以及从那里链接到的资源。@Gserg请查看更新的答案。引用来源:“C#5.0简而言之”第565页。引用非常正确。如果上面的文字是你对引用内容的解释,你可能会误解它。事实上,它从不创建新线程来运行任务,它总是使用从线程池中获取的线程来运行任务,并且在超额订阅情况下-CLR通过排队任务和t避免线程池中的超额订阅hr阻止其启动。@Carl感谢您的更正,更新了我的答案。有两种任务:委托任务(执行代码)和承诺任务(表示未来事件)。只有委托任务实际运行,它们可能在线程池上运行,也可能不运行。详细信息。