我有一个 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/