在不更改Windows区域设置的情况下更改应用程序的区域设置

时间:2013-08-23 21:14:43

标签: c# .net-4.0 locale culture

我有一个有趣的情况,其中语言环境设置与我的C#应用​​程序混乱,因为我没有意识到像Double.Parse这样的方法不会将“1000”转换为1000,但由于编号格式不同而做了一些意想不到的事情

我的问题的一个解决方案是使用double d = double.parse( "1000", new CultureInfo("en-US"));之类的东西。目前,我没有通过CultureInfo。但是,我不想在整个代码中进行此更改,而是想知道在启动时是否可能影响我的应用程序的区域设置。

我发现article on MSDN表示我可以使用以下代码实现此目的:

using System.Threading;
using System.Globalization;
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");

但它没有说明从主线程产生的工作线程是否也会继承父文化。

我认为情况并非如此,因为在.NET 4.5中显然有一个 new CultureInfo.DefaultThreadCurrentCulture属性,它指定应用程序域中所有线程的文化,但是没有在.NET 4.0中是这样的。

有人可以为这个区域设置问题推荐一个很好的解决方案吗?

3 个答案:

答案 0 :(得分:0)

如果新线程不使用相同的区域设置,您可以像这样启动它们:

Thread theNewThread = new Thread(() =>
{
    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");

    //Make something else
});
theNewThread.Start();

或以其他方式;

public static void Start(this Thread thread, CultureInfo cu)
{
    //Set the CU here..

    thread.Start();
}

没有试过这个,但我认为它可以工作

答案 1 :(得分:0)

我最终只是试了一下。在.NET 4.0中,新线程继承其创建线程的区域设置。我根据MSDN文档设置了CurrentCultureCurrentUICulture,并且昨天通过了所有测试,所以这是件好事。

答案 2 :(得分:0)

你可能不得不像在FelipeP建议的那样在.NET 4.0上手动设置它们,因为新的将始终以系统默认文化开头(详见Set default thread culture for all thread?