【问题标题】:Await in Main method - Who gets the control until Task is completed?在 Main 方法中等待 - 在任务完成之前谁获得控制权?
【发布时间】:2020-12-27 22:36:26
【问题描述】:

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

当你在 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()      
}
    

【问题讨论】:

标签: c# async-await main


【解决方案1】:

让您的应用保持活力的主要线程实际上是:

private static void TheRealEntryPoint() => Main().GetAwaiter().GetResult();

(与.Wait() 大致相同,是一种“同步异步”的东西,你永远不应该在自己的代码中编写,但是......在这种特定情况下就足够了)

这样:

  • Task.Run 返回一个未完成的任务
  • 因此await 返回给调用者,带我们回到Main()
  • 处于不完整状态,所以 that await 也返回给调用者 - 所以我们最终进入 TheRealEntryPoint
  • 主线程只是阻塞的地方
  • ...
  • 在某个时候,线程池会拾取工作项并运行它
  • 将任务标记为完成
  • 重新激活F1,现在可以将自身标记为完成
  • 重新激活Main,现在可以将自身标记为完成
  • 解除阻塞在TheRealEntryPoint中的主线程
  • 允许 exe 终止

【讨论】:

  • TheRealEntryPoint() 只是标准的 Main() 吗? ,这意味着线程将在标准 Main() 中阻塞?
  • @SItzik 这是编译器发明的一种方法;名称无关紧要,但实际上不是Main - 编译器可以将任何它喜欢的东西标记为入口点。在本地测试中,它实际上被称为<Main>()(带有尖括号),使其在常规 C# 中无法发音
猜你喜欢
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多