C# 从工作线程更改主线程的CultureInfo

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

在工作线程中引发事件时,是否可以更改主线程的CurrentUICulture

说明代码:

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客户端应用程序和存储在数据库中的用户设置。工作线程连接数据库(这需要一些时间)。成功连接后,应用程序应根据用户设置设置语言。