【问题标题】:Changing CultureInfo of Main thread from worker thread从工作线程更改主线程的 CultureInfo
【发布时间】:2010-07-21 07:42:09
【问题描述】:

在工作线程中引发事件时,是否可以更改主线程的 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);

}

【问题讨论】:

  • 您能否指出为什么线程必须更改主线程的属性?这听起来像是一个非常糟糕的设计。也许最好退后一步,为实际问题寻找更好的解决方案。
  • 它的 WinForm 客户端应用程序,它的用户设置存储在数据库中。工作线程连接数据库(需要一些时间)。连接成功后,应用程序应根据用户设置设置语言。

标签: c# multithreading globalization cultureinfo


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    mainThread.CurrentUICulture = ...;
    

    但是,这让我觉得这是一个相当危险的想法……例如,主线程可能正在检索一些资源。

    为什么不提供一个可以在主线程中调用的方法(例如,如果您使用的是 Windows 窗体,则使用 Control.Invoke - 这里的上下文不清楚)这将允许主线程在一种受控方式,根据需要重新加载资源等。

    【讨论】:

      【解决方案3】:

      您需要调用跨线程回调,如果您的应用程序是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 = ...);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-06
        • 1970-01-01
        • 2018-03-29
        • 1970-01-01
        • 1970-01-01
        • 2019-08-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多