异步等待和线程

时间:2016-05-17 13:57:55

标签: c# .net multithreading async-await threadpool

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

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

正如msdn所说(Asynchronous programming):

  

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

但是在ThreadPool类(ThreadPool Class)的描述中的评论中:

  

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

     

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

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

3 个答案:

答案 0 :(得分:7)

Task

如果您await Task,则将控制流程返回给您方法的来电者,直到"某人"将Task设置为已完成。

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

答案 1 :(得分:4)

async / await on Tasks(不完全是,它适用于“awaitables”,但只是说“任务​​”足够接近这个讨论)。

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

我建议阅读Stephen Cleary的async and await intro以了解有关

的更多信息

答案 2 :(得分:4)

将其放在一个简单的术语中Task可以在不同的Thread上运行,也可以在调用者Thread上运行。当来电者Thread没有资源来运行另一个ThreadPool时,任务将从Thread 获取Task。当Task有足够的资源来运行另一个Thread(空闲模式)时,Task将在调用者{{1}}上运行。

  

与线程相比,任务是一个   更高级别的抽象 - 它表示可能会或可能不会的并发操作   由线程支持。任务是组合的(你可以将它们链接在一起   使用延续)。他们可以使用线程池来减少启动延迟,并且   使用TaskCompletionSource,他们可以利用避免的回调方法   等待I / O绑定操作时一起完成线程。

来源:第565页" C#5.0 in a Nutshell"作者:Joseph Albahari,Ben Albahari。