问题描述
等待未完成的任务将控制权传递给调用方,直到任务完成。
在Main()中使用它时,谁将获得控件?
public static async Task Main()
{
await F1() ; //This await will pass the control to ???
}
public static async Task F1()
{
await Task.Run(()=>{...}) ; //This await will pass the control to Main()
}
解决方法
使您的应用存活的主要线程有效:
private static void TheRealEntryPoint() => Main().GetAwaiter().GetResult();
(与.Wait()
大致相同,是一种“ sync-over-async”的东西,您永远不要用自己的代码编写,但是...在这种特定情况下就足够了)
因此:
-
Task.Run
返回的任务不完整 - 因此,
await
上的返回给呼叫者,使我们回到Main()
- 处于不完整状态,因此那个
await
也会返回给呼叫者-因此我们最终以TheRealEntryPoint
- 主线程只是在其中阻塞
- ...
- 在某个时候,线程池拾取工作项并运行它
- 将任务标记为已完成
- 重新激活
F1
,现在可以将本身标记为完成 - 重新激活
Main
,现在可以将本身标记为完成 - 这将解除阻塞停留在
TheRealEntryPoint
中的主线程 - 允许exe终止