Task.Run()之后如何回到主线程

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

在 C# 控制台应用程序中等待 Task.Run() 后,永远不会返回主线程。在 Task.Run()/Task.Factory.StartNew()/etc. 之后如何返回控制台应用程序中的主线程

谢谢!

c# task
1个回答
0
投票

UI 程序有一个所谓的“消息泵”,即处理来自队列的消息的循环。因此,如果您希望 UI 线程运行某些内容,只需将消息添加到队列中,UI 线程就会拾取该消息并运行您选择的某个委托。如果您在 UI 线程上使用

await
,这将为您完成。

控制台程序不是这样工作的。没有消息泵。如果您使用

void Main()
,程序将在 main 方法返回时终止,即使还有其他线程在做事情。如果你使用
async Task Main()
编译器基本上会做这样的事情:

static void HiddenMain()
{
    var task = Main();
    task.Wait();
}
static async Task Main()
{
   ...
}

.Wait()
只是阻塞主线程以避免提前终止。没有办法让主线程做其他事情。但对于控制台程序来说,这应该没有那么重要。对于大多数非 UI 代码,使用什么线程并不重要,只要一次只有一个线程实际执行操作即可。因此,通常仅使用
await
就足够了。也有例外,例如使用
ThreadLocal<T>
时,但如果不了解您遇到的问题,就很难推荐任何东西。

请注意,“主线程”和“UI 线程”并不完全相同,即使它们经常互换使用。可以有不同的 UI 和主线程,甚至可以有多个 UI 线程。

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