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

问题描述

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

App.OnStartup包含

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

当我在应用程序中按下按钮并转到VM时,我看到Thread.CurrentThread.CurrentUICulture更改为“ en-US”(Thread.CurrentThread.CurrentCulture仍为“ hu-HU”)。我知道这是.net 4.6(https://stackoverflow.com/a/30664385/5852947)之前的问题,但不应存在于4.8中。据我了解,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()中设置了区域性。这种文化不是硬编码的,我只是想简化代码。

enter image description here

在图像上,您可以看到gui是匈牙利语的,但是当我按下一个按钮并且相应的ICommand在VM中运行时,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()可能会导致死锁。不要这样任务表示应该等待的异步操作。

关于文化问题,您可以通过将NoAsyncCurrentCulture中的App.config开关设置为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>

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...