2010-02-10 100 views
21

我用C#编写的应用程序没有GUI或UI,而是写入由另一个应用程序(以XML和其他应用程序)解析的文件。是否可以为.NET应用程序或只是一个线程设置CultureInfo?

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

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

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

而改为使用显式格式不是一种选择(150K +行,大部分由前员工编写)。

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

对不起,当我第一次发布时,我应该在#1中澄清,(我虽然)我已经在所有明确产生的处理程序中完成了此操作。

事实证明,我错过了导致问题的线程/处理程序。因此,应用程序现在正常工作,但问题仍然存在,如果文化可以在所有线程上设置。

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

我怎样才能在当前进程得到所有主题对象(不ProcessThread)?

回答

13

不幸的是,每一个新的线程与系统区域设置信息来启动即使它是从其语言环境更改为其他语言的线程开始的。

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

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

+6

帮助仅当您在创建线程的控制是。有时你必须处理由.NET创建的线程。人们不应该忘记圣行**'System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(“EN-US”); ** – Bitterblue 2014-02-07 12:34:30

6

我不认为你可以设置文化为整个应用程序,但每当你创建一个线程可以设置文化explicilty:

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(); 
    } 
} 
3

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

26

在.NET 4.5,你可以使用CultureInfo.DefaultThreadCurrentCulture

相关问题