当一个async
方法await
一个Task
时,它当前运行的线程会发生什么?
我猜测在UI线程上,消息循环会恢复,在线程池线程上,线程会释放回线程池。但如果线程是手动启动的,会发生什么?还有其他类型的线程吗?
当一个async
方法await
一个Task
时,它当前运行的线程会发生什么?
我猜测在UI线程上,消息循环会恢复,在线程池线程上,线程会释放回线程池。但如果线程是手动启动的,会发生什么?还有其他类型的线程吗?
awaits
(假设它不是已完成的Task或类似内容)时,它就会返回给调用者。由于我们正在讨论代码放弃对线程控制的点,这意味着这是堆栈顶部的最后一块代码。async void
方法时,您才能使用await
,这意味着即使在方法完成之前,它也将在第一个await
处结束线程。awaits
或完成,再次放弃控制权。ConfigureAwait(false)
,否则将使用当前任务调度程序安排延续。实际上,任何线程都可以同步运行异步方法,并且它将等待直到
=>
Stephen Cleary指出,这部分内容不正确:“等待异步方法完成”。措辞真的非常误导人。因此,也许这会更好一点。
=>
所有同步执行的部分都已完成。可以等待已完成的任务,例如Task.FromResult。此外,它可能是另一个异步方法,可以完全同步地执行。
但是,在某个时刻,等待某个操作的位置无法在提供awaiter之前完成,则t.RunSynchronously将退出,即使异步方法尚未完全运行。
void ThreadWorker(object obj)
{
var t = new Task<Task>(AsyncMethod);
t.RunSynchronously();
//in this case, it runs the AsyncMethod completely
//and effectively waits for result
}
async Task AsyncMethod()
{
await Something().ConfigureAwait(false);
//everything from here runs on the ThreadPool
}
RunSynchronously
会等待任务 t
完成;它不会等待从 AsyncMethod
返回的任务完成。 - Stephen Cleary