在Main方法中等待-在任务完成之前,谁来控制?

问题描述

等待未完成的任务将控制权传递给调用方,直到任务完成。

在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终止