.NET 异步 Main 方法线程

Mic*_*han 0 c# clr multithreading asynchronous async-await

我只是想知道在没有SynchronizationContext(例如控制台)的应用程序中,是如何async static Main(args)实现的。是在任何awaita之前的 main 方法的开始

  1. 线程池线程,其中 CLR 本身有一个专用线程,该线程将Main调用排队到线程池并同步等待它完成?

    或者

  2. 它是一个专用的启动线程,它被编译成一个特殊的状态机,在每次等待时同步阻塞线程。或者甚至可能所有await的都合并为一个,main线程等待这个合并的任务完成?

Jon*_*eet 5

一个async static Task Main方法实际上只是生成一个像这样的入口点:

public static void GeneratedEntryPoint(string[] args)
{
    Main(args).GetAwaiter().GetResult();
}
Run Code Online (Sandbox Code Playgroud)

所以就像普通的同步Main方法一样,它在没有同步上下文的线程中启动。这意味着任何延续都在线程池线程上执行。但是初始线程(它将执行任何代码,直到await需要调度延续的第一个表达式)本身不是线程池线程。