async方法在await发生时是否使用线程池线程来完成等待任务?

问题描述 投票:0回答:1

我已经运行了这段代码,在

 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
c# asp.net asynchronous async-await
1个回答
0
投票

这将取决于执行“上下文”。从示例中我猜测您正在运行控制台应用程序。它有一个主线程,但任何“延续”,即等待之后的任何内容,都将在线程池上运行。

在 UI 应用程序中,有一个 UI 上下文。因此,UI 线程上等待的任何内容都将继续在该线程上运行。但任何非 UI 线程上等待的任何内容都将在任意线程池线程上继续。

有关详细信息,请参阅Async/Await 在 C# 中的实际工作原理。

© www.soinside.com 2019 - 2024. All rights reserved.