我正在处理async-await
和任务,但我无法理解一件事:
异步任务是在单独的线程中执行的吗?
正如msdn所说(Asynchronous programming):
async和await关键字不会导致创建其他线程。异步方法不需要多线程,因为异步方法不能在自己的线程上运行。
但是在ThreadPool
类(ThreadPool Class)的描述中的评论中:
使用线程池线程的操作示例包括:
当您创建Task或Task对象以异步执行某些任务时,默认情况下,该任务计划在线程池线程上运行。
所以,现在我不明白async
任务是否使用单独的线程。请解释一下。感谢。
答案 0 :(得分:7)
Task
如果您await
Task
,则将控制流程返回给您方法的来电者,直到"某人"将Task
设置为已完成。
如果您通过Task
或Task.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。