我试图了解异步等待行为,特别是它如何影响主线程,所以我的问题与以下代码相关:
static async Task Main(string[] args)
{
await LongAction();
}
static Task LongAction() => Task.Delay(10000);
执行
LongAction
时主线程会发生什么。据我了解,如果调用者线程不是主线程(我们称之为线程2),在可等待操作进行期间,该线程(线程2)将返回到ThreadPool
(使用默认任务调度程序)。但是主线程会发生这种情况吗(看起来不是这样,因为最初它不是从 TP 中获取的)?如果主线程是具有线程上下文的 UI 线程怎么办?
特别是它如何影响主线程
async
和 await
对于任何特定类型的线程(包括主线程)没有特殊行为。无论线程如何,它“行为方式都是相同的”。然而,不同的框架确实会特殊对待主线程。
据我了解,如果调用者线程不是主线程(我们称其为thread2),则在可等待操作进行期间,该线程(thread2)将返回到ThreadPool(使用默认任务调度程序)。await
的行为始终相同:如果可等待(即任务)尚未完成,则它返回。接下来由框架对该线程执行的操作决定。如果是线程池线程,那么是的,该线程将返回到线程池。
执行LongAction时主线程会发生什么。返回.NET 运行时包含一个存根,它调用
Task
Main
方法,然后阻塞该线程直到任务完成。这是必要的,因为在控制台应用程序中,如果主线程退出,应用程序就会退出。如果主线程是具有线程上下文的 UI 线程怎么办?
所有 UI 框架都有一个“消息循环”,用于处理有关用户输入和其他事件的消息。在这种情况下,线程只是返回到其主循环并继续处理其他事件。