用于设置CurrentCulture的线程创建事件

时间:2008-12-24 16:30:38

标签: .net multithreading globalization culture

我们的应用程序允许用户更改他们运行它的文化,并且文化可能与底层操作系统文化不同。我发现这样做的唯一方法是为每个线程设置Thread.CurrentThread.CurrentCulture和Thread.CurrentThread.CurrentUICulture。

唯一的问题是我们必须为每个线程设置文化,每当我们创建一个新线程时我们都需要记住这样做。如果将线程设置为另一种文化,然后创建一个新线程,它将获得操作系统的文化,而不是创建它的线程。

我想找到一个更好的方法来做到这一点。我只能想到两件事,但我不知道是否有可能。

  1. 在应用程序级别设置区域性,以便所有线程都默认使用该区域性。这可能吗?
  2. 我可以在任何地方订阅线程创建事件吗?这样我就可以设置一个处理程序来设置线程创建的文化。
  3. 即使我需要PInvoke到Win32 API,也欢迎任何想法或帮助。提前谢谢。

    编辑:我发现this question类似,但没有找到答案。

4 个答案:

答案 0 :(得分:1)

可能不是确切的解决方案,但是如何创建一个负责创建线程的类呢?

class MyThreadFactory
{
    public static Thread getThread()
    {
        Thread a = new Thread(..);
        a.CurrentCulture = xxxx;
        return a;
    }
}

用法:

Thread newThread = MyThreadFactory.getThread();

答案 1 :(得分:1)

  1. 您可以将所有文化逻辑和静态资源文件放在UI / Presentation层中,只关心UI线程的文化(假设这里有桌面应用程序)。这将包括资源文件中的任何翻译,任何特定于文化的格式等。
  2. 如果无法实现第一个想法,您可以创建一个线程助手类,在创建长时间运行的线程时为您设置文化。您还需要设置所有线程池线程的文化。
  3. 文化是Windows中特定于线程的概念,Windows中的线程实际上与进程或应用程序域无关。线程和拥有文化信息的OS(我知道)之间没有抽象级别,所以你必须在每个线程上设置它。

答案 2 :(得分:1)

.NET 4.5中的CultureInfo类添加了两个新属性来解决此问题,DefaultThreadCurrentCultureDefaultThreadCurrentUICulture

现在您可以设置这两个属性,并且所有新线程都将设置为默认区域而不是系统区域性。这些属性还将为没有明确设置其文化集的所有现有线程设置文化。

答案 3 :(得分:0)

刚刚添加到@Rob Prouse的回答。这是一个快速演示。

  1. 在App初始化中设置文化:

      if(CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol != "N$")
      {
           CultureInfo customCulture = CultureInfo.CreateSpecificCulture(CultureInfo.CurrentCulture.Name);
           customCulture.NumberFormat.CurrencySymbol = "N$";
    
           CultureInfo.DefaultThreadCurrentCulture = customCulture;
           CultureInfo.DefaultThreadCurrentUICulture = customCulture;
       }
    
  2. 在我的.ToString()上使用文化信息。

     .ToString("C", CultureInfo.DefaultThreadCurrentCulture)