【发布时间】:2020-09-07 14:28:59
【问题描述】:
我有一个旧 API,它以这种方式切换当前文化:
private void ChangeCulture(int lcid)
{
Debug.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] ChangeCulture Culture Start: {Thread.CurrentThread.CurrentCulture}");
var newCulture = CultureInfo.GetCultureInfo(lcid);
Debug.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] Changing culture of currentThread to: {newCulture}");
Thread.CurrentThread.CurrentCulture = newCulture;
Thread.CurrentThread.CurrentUICulture = newCulture;
// Old framework compatibility (not important for this example)
CultureInfo.DefaultThreadCurrentCulture = newCulture;
CultureInfo.DefaultThreadCurrentUICulture = newCulture;
Debug.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] ChangeCulture Culture End: {Thread.CurrentThread.CurrentCulture}");
}
以前,代码是从同步上下文中调用的。但是,由于现在需要从异步上下文中调用代码。喜欢这里:
private async void Button_Click(object sender, RoutedEventArgs e)
{
Debug.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}]Culture Start: {Thread.CurrentThread.CurrentCulture}");
if (this.currrentLcid == 1031)
{
await Task.Delay(1000);
this.ChangeCulture(1033);
this.currrentLcid = 1033;
}
else
{
await Task.Delay(1000);
this.ChangeCulture(1031);
this.currrentLcid = 1031;
}
Debug.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}]Culture End: {Thread.CurrentThread.CurrentCulture}");
}
输出:
[1]Culture Start: de-DE
[1] ChangeCulture Culture Start: de-DE
[1] Changing culture of currentThread to: en-US
[1] ChangeCulture Culture End: en-US
[1]Culture End: en-US
异步执行的文化流程。但它不会在全球范围内回流。如果我打电话:
private void CheckCulture_Click(object sender, RoutedEventArgs e)
{
Debug.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}]CheckCulture_Click: {Thread.CurrentThread.CurrentCulture}");
}
输出:
[1]CheckCulture_Click: de-DE
一切都是主线程。 (ManagedThreadId=1)
.NET 框架 4.8
如何在不知道调用上下文的情况下全局切换当前文化?
【问题讨论】:
-
点击
CheckCulture按钮时的预期结果是什么? -
@TheodorZoulias 是的,美国。这是最后设定的文化
标签: c# wpf asynchronous culture executioncontext