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

时间:2010-07-21 07:42:09

标签: c# multithreading globalization cultureinfo

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

ilustration代码:

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);

}

3 个答案:

答案 0 :(得分:1)

你需要工作线程知道主线程,所以它可以这样做:

mainThread.CurrentUICulture = ...;

然而,这让我觉得这是一个相当危险的想法......例如,主要线程可能是检索一些资源的一半。

为什么没有一个可以在主线程中调用的方法(例如,如果你正在使用Windows窗体时使用Control.Invoke - 这里的上下文不清楚)这将允许主线程改变它自己的以可控的方式培养文化,必要时重新加载资源等。

答案 1 :(得分:1)

  

它的WinForm客户端应用程序,它具有存储在数据库中的用户设置。工作线程连接数据库(需要一些时间)。连接成功后,应用程序应根据用户设置设置语言。

当你的线程完成后,可以使用MainForm.Invoke(helperMethod),然后在主线程上运行helperMethod,并可以安全地设置文化。

backgroundworker会让它更容易。它有一个在主线程上运行的Completed事件。

答案 2 :(得分:0)

你需要调用跨线程回调,如果你的应用程序是WinForms应用程序,那么你可以使用ISyncronizedInvoke(它由任何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 = ...);
}