代码之家  ›  专栏  ›  技术社区  ›  NVRAM

可以为.NET应用程序或线程设置CultureInfo吗?

  •  23
  • NVRAM  · 技术社区  · 14 年前

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

    我有一个客户的CultureInfo将NumberDecimalSeparator设置为逗号,这会导致使用浮点数分析错误(pi将以 31415个 )

    我想为所有线程在应用程序中全局设置CultureInfo。我试过了:

    1. 设置的习惯方法 当前线程。当前区域性 作为第一行 主体() 但它似乎被重置了。
    2. 变化/扩展 http://www.codeproject.com/KB/cs/Change_App_Culture.aspx
    3. 对应用程序中显式创建的线程执行相同的(1)。

    更改为使用显式格式不是一个选项(150k+行,大多数由以前的员工编写)。

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

    抱歉,当我第一次发布时,我应该在1中澄清( 我虽然 )我已经在所有显式生成的处理程序中完成了这一点。

    结果发现我错过了导致问题的线程/处理程序。 所以应用程序现在工作正常,但问题仍然在于是否可以在所有线程上设置区域性。

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

    我怎样才能得到全部 螺纹 对象(不是) 进程线程 )在当前进程中?

    4 回复  |  直到 7 年前
        1
  •  14
  •   Jon Seigel    14 年前

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

    这是我在我们的一个应用程序中使用 BackgroundWorker 加载文件。

    我成功使用的方法是在启动线程上设置区域设置,然后使用线程工厂创建具有“应用程序区域设置”的线程。对于BackgroundWorkers,可以使用工厂或派生类,例如 Thread 封存 背景工作者 不是。

        2
  •  30
  •   BPeter    12 年前

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

        3
  •  6
  •   Paolo Tedesco    14 年前

    我认为您不能为整个应用程序设置区域性,但您可以在创建线程时明确设置区域性:

    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
  •  3
  •   erikvimz ThatGuy    7 年前

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