我想为我的整个应用程序设置文化.我尝试了以下方法:
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(wantedCulture); Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(wantedCulture); Application.CurrentCulture = CultureInfo.CreateSpecificCulture(wantedCulture);
它适用于当前线程,但稍后我创建并启动后台工作线程.当我创建worker时,当前线程使用wantedCulture执行,但工作线程将使用我的计算机文化运行.
为整个应用程序设置文化的任何想法?
注意:注明日期的材料,请务必阅读底部的更新以了解.NET 4.6中的更改
是的,这是一个常见的请求,但它不可用.Windows始终将OS线程初始化为系统默认LCID,在"控制面板"的"区域和语言选项"小程序中进行配置.只要您自己创建线程,就可以覆盖它.但是,对于线程池线程和线程来说,这可能是由运行您的进程的某种非托管代码(如COM服务器)创建的.
后一种情况是问题所在..NET在由非托管代码创建的线程上运行托管代码没有问题.但它无法对线程初始化的方式做任何事情.这对于CurrentUICulture来说也是如此,但对于像Thread.SetApartmentState()这样更加模糊的东西也是如此.不要低估这样一个线程在程序中运行代码的可能性,Microsoft编写的COM服务器非常高兴.
您将不得不使用细齿梳子填写您的代码,并找到可能在您未创建的线程上运行的任何代码.任何事件处理程序都是可疑的,任何具有回调的BeginXxx()方法都是如此.BackgroundWorker肯定是较小的问题.
不重写线程的文化可以产生非常微妙和难以诊断的bugz.一个很好的例子是一个键入字符串的SortedList.当使用错误的文化运行时,它将无法找到列表中实际存在的元素.由于列表不再在具有不同排序规则的另一种文化中进行排序而导致.
如果我设法吓到你,那么我就会传达我的信息.这件事发生在我身上,用一个在丹麦机器上行为不端的大型程序调试问题.我们没有丹麦语本地化,并迫使用户界面以英语运行.工作线程使用了一个以字符串为键的红黑树.当被要求与Åårdvårks打交道时,它失败了.花了我一个星期.
更新:此问题已在.NET 4.5中得到解决.CultureInfo类现在有一个DefaultThreadCurrentCulture和DefaultThreadCurrentUICulture.设置后,它将用于初始化任何托管线程的文化,而不是默认的Windows系统文化.究竟它是如何与本机代码启动的线程交互并输入托管代码的,我还不清楚.
更新:这个问题在.NET 4.6中有一个更彻底的解决方案.文化现在自动流动,是理想的行为.CultureInfo.CurrentCulture()的MSDN文章讨论了它.提供的信息仍然令人困惑,实验上它似乎也流向Thread对象,而不仅仅是Task或线程池线程,并且不使用DefaultThreadCurrentCulture.向前迈出两步,退一步,建议进行测试.