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