我有一个有趣的情况,其中语言环境设置与我的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中是这样的。
有人可以为这个区域设置问题推荐一个很好的解决方案吗?
答案 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文档设置了CurrentCulture
和CurrentUICulture
,并且昨天通过了所有测试,所以这是件好事。
答案 2 :(得分:0)
你可能不得不像在FelipeP建议的那样在.NET 4.0上手动设置它们,因为新的将始终以系统默认文化开头(详见Set default thread culture for all thread?)