C# 从工作线程更改主线程的CultureInfo
在工作线程中引发事件时,是否可以更改主线程的CurrentUICulture 说明代码:C# 从工作线程更改主线程的CultureInfo,c#,multithreading,globalization,cultureinfo,C#,Multithreading,Globalization,Cultureinfo,在工作线程中引发事件时,是否可以更改主线程的CurrentUICulture 说明代码: static void Main() { //do something Thread workerThread = new Thread(new ThreadStart(DoWork)); workerThread.Start(); //do something } void DoWork() { ConnectDatabase(); //do some work
static void Main()
{
//do something
Thread workerThread = new Thread(new ThreadStart(DoWork));
workerThread.Start();
//do something
}
void DoWork()
{
ConnectDatabase();
//do some work
ChangeLanguage(lang);
}
void ChangeLanguage(string lang)
{
//this line changes Culture only for worker thread
System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.CreateSpecificCulture(lang);
}
您需要工作线程了解主线程,这样它就可以:
mainThread.CurrentUICulture = ...;
然而,我觉得这是一个相当危险的想法。。。例如,主线程可以在检索某些资源的过程中完成一半
为什么不拥有一个可以在主线程中调用的方法(例如,如果使用Windows窗体,则使用
Control.invoke
,此处上下文不清楚),该方法将允许主线程以受控的方式更改其自身的区域性,必要时重新加载资源等。您需要调用跨线程回调,如果您的应用程序是WinForms应用程序,则可以使用(它由任何WinForms控件实现)
如果没有,则可以使用跨上下文回调:
static void Main()
{
Thread workerThread = new Thread(new ParameterizedThreadStart(DoWork));
workerThread.Start(Thread.CurrentContext);
}
void DoWork(object state)
{
ConnectDatabase();
//do some work
((Context)state).DoCallBack(() => Thread.CurrentThread.CurrentUICulture = ...);
}
它的WinForm客户端应用程序,并将用户设置存储在数据库中。工作线程连接数据库(这需要一些时间)。成功连接后,应用程序应根据用户设置设置语言 线程完成后,可以使用
MainForm.Invoke(helperMethod)
,然后helperMethod在主线程上运行,并可以安全地设置区域性
A会让事情变得更容易。它有一个在主线程上运行的已完成事件。能否指出线程为什么必须更改主线程的属性?这听起来像是一个非常糟糕的设计。也许最好退一步,为实际问题寻找更好的解决方案。它的WinForm客户端应用程序和存储在数据库中的用户设置。工作线程连接数据库(这需要一些时间)。成功连接后,应用程序应根据用户设置设置语言。