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

为整个appdomain定义区域性

  •  6
  • Nissim  · 技术社区  · 14 年前

    我正在创建一个运行多线程的windows服务。 我是否可以设置整个appDomain的区域性,而不是将其分别设置为每个线程?

    3 回复  |  直到 14 年前
        1
  •  8
  •   Hans Passant    8 年前

    这是不可能的。当Windows创建线程时,线程将获得其默认区域性,该区域性是从控制面板+区域和语言中配置的系统默认区域设置初始化的。相关的Win32 API函数是Get/SetThreadLocale()。

    当然可以显式重写它,但这很难正确。细微的格式错误很容易看到,但当您使用隐含地依赖于字符串的排序顺序的数据结构时,就会变得很困难。SortedList突然在列表中找不到实际存在的元素。控制它也很困难,在整个.NET框架中有很多小线程池线程回调。


    更新:正如Thomas所指出的,在.NET4.5中提供了一个解决方案,它为CultureInfo类提供了一个新属性来设置appdomain的默认区域性。MSDN文档 are here


    更新2:这在.NET4.6中再次被更改,区域性现在从一个线程流到另一个线程,因此最糟糕的故障模式将得到处理。请阅读MSDN文章中有关它的详细信息CultureInfo.CurrentCulture文化. 你必须明确目标4.6才能得到好处。

        2
  •  17
  •   bluish dmajkic    10 年前
        3
  •  3
  •   Darin Dimitrov    14 年前

    static bool StartThread(WaitCallback callback, object state)
    {
        return ThreadPool.QueueUserWorkItem(s =>
        {
            // Set the culture
            Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES");
            // invoke the callback
            callback(s);
        }, state);
    }
    

    当您需要启动一个新线程时,只需使用以下方法:

    StartThread(state => { /** Do some processing on a new thread **/ }, null);