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