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

NVR*_*RAM 24 c# culture cultureinfo number-formatting

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

我有一个客户,其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中澄清(我虽然)我已经在所有明确生成的处理程序中完成了这一点.

事实证明我错过了导致问题的线程/处理程序. 所以应用程序现在正常工作,但问题仍然是关于是否可以在所有线程上设置文化.

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

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

BPe*_*ter 33

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


Jon*_*gel 14

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

当我使用一个BackgroundWorker加载文件时,我在我们的一个应用程序中遇到了这个问题.

我成功使用的方法是在启动线程上设置区域设置,然后使用线程工厂创建具有"应用程序区域设置"的线程.对于BackgroundWorkers,您可以使用工厂类或派生类,Thread而BackgroundWorker不是密封.

  • 只有在您控制线程创建时才有帮助.有时您必须处理.NET创建的线程.人们永远不应该忘记圣线**System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("EN-US");`** (8认同)

Pao*_*sco 6

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

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();
    }
}
Run Code Online (Sandbox Code Playgroud)