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

C# 在主方法中等待-在任务完成之前谁获得控制权?,c#,async-await,main,C#,Async Await,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

在未完成的任务将控件传递给调用方之前等待,直到任务完成

当您在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 thealentrypoint()=>Main().GetAwaiter().GetResult();
(这与
.Wait()
大致相同,是一种“异步同步”的东西,您永远不应该在自己的代码中编写,但是……这在这个特定场景中就足够了)

因此:

  • Task.Run
    返回一个未完成的任务
  • 因此,
    wait
    返回调用者,将我们带回
    Main()
  • 在未完成状态下,
    wait
    也返回到调用者-因此我们最终进入
    TheAlentryPoint
  • 其中主线程只是阻塞
  • 在某个时刻,线程池将拾取工作项并运行它
  • 将任务标记为已完成
  • 重新激活F1,现在可以将自身标记为完成
  • 重新激活
    Main
    ,现在可以将自身标记为完成
  • 这将解锁卡在alentryPoint中的主线程
  • 允许exe终止

@GSerg Hi,谢谢你的评论,但是你提供的链接没有回答我的问题。它回答了。它用简单的英语描述了发布在下面的相关代码行。同一行代码现在也被重新发布在中。ThealentryPoint()只是标准的Main()吗,这意味着线程将被标准Main()阻塞?@SItzik这是编译器发明的一种方法;名称是不相关的,但它实际上不是
Main
——编译器可以将它喜欢的任何东西标记为入口点。在一个本地测试中,它实际上被称为
()
(带尖括号),这使得它在常规C语言中不可发音#