我已经运行了这段代码,在
await Task.Delay(5000)
之后我可以看到,哪个线程启动了不同的方法执行,在await块执行之后,也是线程池。
static async Task Method3()
{
MetaInfoHelper("Method 3");
Console.WriteLine("Method 3 is about to execute ....");
await Task.Delay(5000);
MetaInfoHelper("Method 3");
Console.WriteLine("Method 3 completed execution.");
MetaInfoHelper("Method 3");
}
static void MetaInfoHelper(string methodName)
{
Console.WriteLine($"{methodName} IsThreadPoolThread : {Thread.CurrentThread.IsThreadPoolThread}, ManagedThreadId : {Thread.CurrentThread.ManagedThreadId} , IsBackground : {Thread.CurrentThread.IsBackground}");
}
输出:
Method 3 IsThreadPoolThread : False, ManagedThreadId : 1 , IsBackground : False
Method 3 is about to execute ....
Method 3 IsThreadPoolThread : True, ManagedThreadId : 8 , IsBackground : True
Method 3 completed execution.
Method 3 IsThreadPoolThread : True, ManagedThreadId : 8 , IsBackground : True
这将取决于执行“上下文”。从示例中我猜测您正在运行控制台应用程序。它有一个主线程,但任何“延续”,即等待之后的任何内容,都将在线程池上运行。
在 UI 应用程序中,有一个 UI 上下文。因此,UI 线程上等待的任何内容都将继续在该线程上运行。但任何非 UI 线程上等待的任何内容都将在任意线程池线程上继续。
有关详细信息,请参阅Async/Await 在 C# 中的实际工作原理。