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>
我开始在我的 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 之前的一个问题(
这个我也试过了,没成功。
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("hu-HU");
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("hu-HU");
更新 1
我有一个 WPF 应用程序,我在 OnStartup()
中设置了区域性。文化不是硬编码的,我只是想简化代码。
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>