在 Main 方法中等待 - 谁获得控制权,直到任务完成?

S I*_*zik 4 c# program-entry-point async-await

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

当您在 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()      
}
    
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 9

使您的应用程序保持活动状态的主线程有效地是:

private static void TheRealEntryPoint() => Main().GetAwaiter().GetResult();
Run Code Online (Sandbox Code Playgroud)

(这与 大致相同.Wait(),并且是您永远不应该在自己的代码中编写的那种“异步同步”的东西,但是......在这个特定场景中就足够了)

像这样:

  • Task.Run返回一个未完成的任务
  • 因此await返回给调用者的on,带我们回到Main()
  • 在一个不完整的状态,所以 await也返回给调用者-所以我们结束了TheRealEntryPoint
  • 主线程简单地阻塞的地方
  • ...
  • 在某些时候,线程池拿起工作项并运行它
  • 将任务标记为完成
  • 它重新激活F1,现在可以将自己标记为完成
  • 它重新激活Main,现在可以将自己标记为完成
  • 解除阻塞的主线程 TheRealEntryPoint
  • 这允许exe终止