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

Posted

技术标签:

【中文标题】用于设置 CurrentCulture 的线程创建事件【英文标题】:Thread Creation Event for setting CurrentCulture 【发布时间】:2008-12-24 16:30:37 【问题描述】:

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

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

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

    在应用程序级别设置区域性,以便所有线程默认使用该区域性。这可能吗? 是否有我可以订阅的线程创建事件?这样我就可以设置一个处理程序来设置线程创建的文化。

欢迎任何想法或帮助,即使我需要 PInvoke 到 Win32 API。提前致谢。

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

【问题讨论】:

我认为你只需要记住改变每个线程的文化。对不起。 【参考方案1】:

可能不是确切的解决方案,但是创建一个负责创建线程的类怎么样?

class MyThreadFactory

    public static Thread getThread()
    
        Thread a = new Thread(..);
        a.CurrentCulture = xxxx;
        return a;
    

用法:

Thread newThread = MyThreadFactory.getThread();

【讨论】:

【参考方案2】:
    您可以将所有文化逻辑和静态资源文件放在 UI/Presentation 层中,而只需担心 UI 线程的文化(假设此处为桌面应用程序)。这将包括资源文件中的任何翻译、任何特定文化的格式等。 如果第一个想法无法实现,您可以创建一个线程助手类,在创建长时间运行的线程时为您设置文化。您还需要设置所有线程池线程的区域性。

文化是 Windows 中特定于线程的概念,Windows 中的线程实际上与进程或应用程序域无关。线程和保存文化信息(据我所知)的操作系统之间没有抽象级别,因此您必须在每个线程上设置它。

【讨论】:

【参考方案3】:

在 .NET 4.5 的 CultureInfo 类中添加了两个新属性,DefaultThreadCurrentCulture 和 DefaultThreadCurrentUICulture。

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

【讨论】:

【参考方案4】:

只是为了添加到@Rob Prouse 的答案。这是一个快速演示。

    设置应用程序初始化的文化:

      if(CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol != "N$")
      
           CultureInfo customCulture = CultureInfo.CreateSpecificCulture(CultureInfo.CurrentCulture.Name);
           customCulture.NumberFormat.CurrencySymbol = "N$";
    
           CultureInfo.DefaultThreadCurrentCulture = customCulture;
           CultureInfo.DefaultThreadCurrentUICulture = customCulture;
       
    

    使用我的 .ToString() 上的文化信息。

     .ToString("C", CultureInfo.DefaultThreadCurrentCulture)
    

【讨论】:

以上是关于用于设置 CurrentCulture 的线程创建事件的主要内容,如果未能解决你的问题,请参考以下文章

在 VSTO 插件中设置 CurrentCulture

CurrentCulture 与 async/await,自定义同步上下文

如何为每个线程设置时区? [关闭]

利用CurrentCulture将人民币符号更改为欧元符号

具有不同 CurrentCulture 和 CurrentUICulture 的 WPF 应用程序

CultureInfo.CurrentCulture 不包含正确的值 --> numberformat 问题