是否可以为 .NET 应用程序或仅为线程设置 CultureInfo?

Posted

技术标签:

【中文标题】是否可以为 .NET 应用程序或仅为线程设置 CultureInfo?【英文标题】:Is it possible to set the CultureInfo for an .NET application or just a thread? 【发布时间】:2011-01-15 02:58:37 【问题描述】:

我有一个用 C# 编写的应用程序,它没有 GUI 或 UI,而是编写由另一个应用程序(XML 和其他应用程序)解析的文件。

我有一个客户,其 CultureInfo 的 NumberDecimalSeparator 设置为逗号,这会导致浮点数解析错误(PI 最终会为 3,1415)。

我想要一种在应用程序中为所有线程全局设置 CultureInfo 的方法。我试过了:

    (显然)将 CurrentThread.CurrentCulture 设置为 Main() 中的第一行的习惯方法,但它似乎已被重置。 http://www.codeproject.com/KB/cs/Change_App_Culture.aspx 的变体/扩展 对应用程序中显式创建的线程执行相同的操作 (#1)。

更改为使用显式格式不是一种选择(超过 15 万行,大部分由前雇员编写)。

[编辑] 应用程序绑定到一个套接字并处理来自专用客户端的请求。根据请求类型,它会产生不同的处理程序类。

抱歉,当我第一次发帖时,我应该在 #1 中澄清(我虽然)我在所有显式生成的处理程序中都这样做了。

原来我错过了导致问题的线程/处理程序。所以应用程序现在工作正常,但问题仍然是是否可以在所有线程上设置文化。

如果它可以遍历所有线程,它也可以解决问题。所以:

如何获取当前进程中的所有Thread对象(不是ProcessThread)?

【问题讨论】:

【参考方案1】:

在 .NET 4.5 中,您可以使用 CultureInfo.DefaultThreadCurrentCulture

【讨论】:

【参考方案2】:

不幸的是,每个新线程都以系统区域设置信息开始,即使它是从将其区域设置更改为其他内容的线程启动的。

这是我在使用BackgroundWorker 加载文件时在我们的一个应用程序中遇到的一个巨大问题。

我成功使用的方法是在启动线程上设置语言环境,然后使用线程工厂创建具有“应用程序语言环境”的线程。对于 BackgroundWorkers,您可以使用工厂或派生类,因为 Thread 是密封的,而 BackgroundWorker 不是。

【讨论】:

只有在您控制线程创建时才有帮助。有时您必须处理由 .NET 创建的线程。永远不要忘记圣言System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("EN-US");【参考方案3】:

我认为您不能为整个应用程序设置文化,但您可以在创建线程时设置文化显式:

using System;
using System.Globalization;
using System.Threading;

class Program 

    static void thread_test() 
        Console.WriteLine("Culture: 0", CultureInfo.CurrentCulture.DisplayName);
    

    public static void Main(params string[] args) 
        Thread t = new Thread(thread_test);
        t.CurrentCulture = new CultureInfo("it-it");
        t.Start();
        t.Join();
    

【讨论】:

【参考方案4】:

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

【讨论】:

以上是关于是否可以为 .NET 应用程序或仅为线程设置 CultureInfo?的主要内容,如果未能解决你的问题,请参考以下文章

仅为输入字段设置背景颜色 选择选项列表

Mpdf:仅为第 1 页设置 0 页边距

我将哪个 CultureInfo 属性设置为在所有应用程序线程中使用它

仅为部分 UIView 设置背景颜色

如何仅为特定的 IE 浏览器设置 CSS?

Swift 4仅为一个视图控制器设置导航属性