5

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

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

在 MSDN 上找到了一篇文章,说我可以使用以下代码实现这一点:

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

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

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

任何人都可以为这个语言环境问题推荐一个很好的解决方案吗?

4

3 回答 3

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();
}

没试过,但我想它可以工作

于 2013-08-25T00:24:57.423 回答
0

我最终只是尝试了一下。在 .NET 4.0 中,新线程不会继承创建它们的线程的语言环境。我确实按照 MSDN 文档进行了设置CurrentCultureCurrentUICulture昨天所有的测试都通过了,所以这是一件好事。

于 2013-08-25T00:58:04.430 回答
0

您可能必须像 FelipeP 建议的那样在 .NET 4.0 上手动设置它们,因为新的将始终以系统默认区域性开头(请参阅此处为所有线程设置默认线程区域性的详细信息?

于 2013-08-26T16:10:05.890 回答