在 Main 方法中等待 - 在任务完成之前谁获得控制权?

Await in Main method - Who gets the control until Task is completed?

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

当您在 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.Runreturns未完成的任务
  • 因此 returns 上的 await 到调用者,带我们回到 Main()
  • 处于不完整状态,所以 that await 也 returns 到调用者 - 所以我们最终在 TheRealEntryPoint
  • 主线程只是阻塞
  • ...
  • 在某些时候,thread-pool 选取工作项并运行它
  • 将任务标记为完成
  • 重新激活 F1,现在可以将 自身 标记为完整
  • 重新激活 Main,现在可以将 自身 标记为完整
  • 这会解除卡在 TheRealEntryPoint
  • 中的主线程的阻塞
  • 允许 exe 终止