Thread.CurrentThread.CurrentUICulture 使用异步时更改 .net 4.8

Thread.CurrentThread.CurrentUICulture changes .net 4.8 when async is used

我开始在我的 WPF 应用程序中使用异步操作,并意识到按钮、标签在正确的区域性 (hu-HU) 上,但 MessageBox.Show 在操作系统的区域性上工作 (en-US) ).我有两种语言的资源文件。

App.OnStartup 包含

Thread.CurrentThread.CurrentCulture = new CultureInfo("hu-HU");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("hu-HU");

当我在我的应用程序中按下一个按钮并转到虚拟机时,我看到 Thread.CurrentThread.CurrentUICulture 更改为“en-US”(Thread.CurrentThread.CurrentCulture 仍然是“hu-HU”)。我知道这是 .net 4.6 之前的一个问题() but it should not be in 4.8. As I understand https://docs.microsoft.com/en-us/dotnet/api/system.globalization.cultureinfo?view=netcore-3.1#Async 声明这两种文化都应该从原始线程继承。

这个我也试过了,没成功。

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("hu-HU");
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("hu-HU");

更新 1

我有一个 WPF 应用程序,我在 OnStartup() 中设置了区域性。文化不是硬编码的,我只是想简化代码。 在图像上,您可以看到 gui 是匈牙利语,但是当我按下一个按钮时,VM 中相应的 ICommand 运行 然后 CurrentUICulture 是不正确的。在执行 ICommand 的调试模式下,我还看到 CurrentUICulture 不正确。我只在 App.OnStartup 中设置文化。在我不使用异步之前我没有问题。我将 OnStartup() 更改为异步,因为它一度包含 await.

    protected async override void OnStartup(StartupEventArgs startupEventArgs)
    {
            base.OnStartup(startupEventArgs);
            var cultureString = ConfigurationManager.AppSettings["Language"];
            Thread.CurrentThread.CurrentCulture = new CultureInfo(cultureString);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureString);
            CultureInfo.DefaultThreadCurrentCulture = new CultureInfo(cultureString);
            CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo(cultureString);
            var mainWindowView = new MainWindowView();
            // ...
            mainWindowView.Show();
            ScrollDownInTableTab(mainWindowViewModel);            
    }

在任务块上调用 Wait() 并且可能还会出现死锁。不要这样做。任务表示应等待的异步操作。

至于文化问题,您可以通过在 App.config:

中将 NoAsyncCurrentCulture 开关设置为 true 来切换回旧行为
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>
    </startup>
    <runtime>
        <AppContextSwitchOverrides value="Switch.System.Globalization.NoAsyncCurrentCulture=true"/>
    </runtime>
</configuration>