异步/等待和主线程

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

我试图了解异步等待行为,特别是它如何影响主线程,所以我的问题与以下代码相关:

    static async Task Main(string[] args)
    {
        await LongAction();
    }

    static Task LongAction() => Task.Delay(10000);

执行

LongAction
时主线程会发生什么。据我了解,如果调用者线程不是主线程(我们称之为线程2),在可等待操作进行期间,该线程(线程2)将返回到
ThreadPool
(使用默认任务调度程序)。但是主线程会发生这种情况吗(看起来不是这样,因为最初它不是从 TP 中获取的)?如果主线程是具有线程上下文的 UI 线程怎么办?

c# multithreading async-await task
1个回答
5
投票

特别是它如何影响主线程

async
await
对于任何特定类型的线程(包括主线程)没有特殊行为。无论线程如何,它“行为方式都是相同的”。然而,不同的框架确实会特殊对待主线程。

据我了解,如果调用者线程不是主线程(我们称其为thread2),则在可等待操作进行期间,该线程(thread2)将返回到ThreadPool(使用默认任务调度程序)。

await

的行为始终相同:如果可等待(即任务)尚未完成,则它返回。接下来由框架对该线程执行的操作决定。如果是线程池线程,那么是的,该线程将返回到线程池。


执行LongAction时主线程会发生什么。

.NET 运行时包含一个存根,它调用

Task
返回

Main

 方法,然后阻塞该线程直到任务完成。这是必要的,因为在控制台应用程序中,如果主线程退出,应用程序就会退出。
如果主线程是具有线程上下文的 UI 线程怎么办?

所有 UI 框架都有一个“消息循环”,用于处理有关用户输入和其他事件的消息。在这种情况下,线程只是返回到其主循环并继续处理其他事件。

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