gpt4 book ai didi

c# - 为 async void main 设置 ApartmentState

转载 作者:行者123 更新时间:2023-11-30 14:22:57 24 4
gpt4 key购买 nike

我有一个 Windows 窗体应用程序。

现在我想使用一个async方法。

从 C# 7.1 开始,我可以使用 async Main 方法:
https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-7-1

但是,现在我的 STAThread 属性被忽略,我的应用程序在 MTA 中运行。这是设计使然,还是我可以强制我的应用再次以 STA 模式运行?

/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
private static async Task Main(string[] args)
{
// returns MTA
Console.WriteLine("{0}", Thread.CurrentThread.ApartmentState);
}

最佳答案

STA是您 promise 单个线程将操作 Windows 消息泵的线程(通常隐藏在对 Application.Run() 的调用之后)。当线程未被占用时,您将在线程上运行消息泵。

async 方法是这样一种方法,当它没有更好的事可做时,将释放它的线程以离开并做其他事情。

我无法使这两个概念保持一致。如果你想要 STA,你想要保留那个线程和泵消息。所以使用 async main 在那里没有意义。


在这种特殊情况下(各种初始化步骤可以从 await 中受益,然后是 Application.Run 我会使用 async Main < em>没有 STAThread 属性。然后我将显式创建一个专门用于运行 Windows 消息循环的 STA 线程。

没有规定程序中的第一个线程必须是 STA 线程,我认为这提供了最清晰的分离。如果您的 async Main 没有进一步有用的工作要做,您可能需要在 Main 和消息循环运行线程之间共享一个 TaskCompletionSource然后在 Application.Run() 返回时发出完成信号。

关于c# - 为 async void main 设置 ApartmentState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47553489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com