C# 如何在.Net中更改整个进程(而不仅仅是当前线程)的当前区域性?

C# 如何在.Net中更改整个进程(而不仅仅是当前线程)的当前区域性?,c#,.net,localization,globalization,C#,.net,Localization,Globalization,我有一种情况,我需要将我的进程的locale设置为en-US 我知道如何为当前线程执行此操作: System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US"); 但是我的应用程序使用BackgroundWorkers进行一些处理,并且这些工作线程的区域设置似乎不受上述对其生成主线程的更改的影响 那么,我如何为应

我有一种情况,我需要将我的进程的locale设置为en-US

我知道如何为当前线程执行此操作:

System.Threading.Thread.CurrentThread.CurrentCulture = 
     System.Globalization.CultureInfo.CreateSpecificCulture("en-US");
但是我的应用程序使用
BackgroundWorkers
进行一些处理,并且这些工作线程的区域设置似乎不受上述对其生成主线程的更改的影响


那么,我如何为应用程序中的所有线程设置区域设置,而不在每个线程中手动设置呢?

如果要这样做,您必须更改操作系统区域设置。你为什么希望后台人员在美国工作

您应该让业务层在不变的区域性中运行,并且对于最终用户的UI只有特定的区域性

如果您正在使用该组件,并且必须执行此操作,则可以在DoWork方法中尝试以下操作:

// In DoWork
System.Globalization.CultureInfo before = System.Threading.Thread.CurrentThread.CurrentCulture;
try

{
    System.Threading.Thread.CurrentThread.CurrentCulture = 
        new System.Globalization.CultureInfo("en-US");
 // Proceed with specific code
}

finally
{
    System.Threading.Thread.CurrentThread.CurrentUICulture = before;
}

我们对BackgroundWorker使用helper类,如下所示:

public static class BackgroundWorkerHelper
{
public static void RunInBackground(Action doWorkAction, Action completedAction, CultureInfo cultureInfo)
    {
        var worker = new BackgroundWorker();
        worker.DoWork += (_, args) =>
        {
            System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo;
            System.Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo;
            doWorkAction.Invoke();
        };
        worker.RunWorkerCompleted += (_, args) =>
        {
            System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo;
            System.Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo;
            completedAction.Invoke();
        };

        worker.RunWorkerAsync();
    }
}
用法示例:

BackgroundWorkerHelper.RunInBackground(() => { Work(); }, () => { AfterWork(); },Thread.CurrentThread.CurrentCulture);

在4.0中,您需要通过为每个线程设置区域性来自行管理。但是使用4.5,您可以为appdomain定义区域性,这是处理此问题的首选方法。相关的API包括和。

使用以下内容:

worker.RunWorkerAsync(Thread.CurrentThread.CurrentCulture.LCID);//Pass the LCID as argument
工作完成后,请执行以下操作:

Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(int.Parse(e.Argument.ToString()));

后台工作程序很可能在UI层中运行(例如,作为
表单上的
BackgroundWorker
组件)@Fredrik-是(特别是如果它是后台工作程序组件),但您不会在后台工作程序线程上更新UI。如果你正确使用它,至少你不知道。后台工作程序对一些输入执行double.Parse(字符串),这对于某些具有奇怪小数点表示的区域设置是中断的。因此,我仍然需要知道如何为整个过程设置区域设置。你是说这是不可能的吗?阿萨夫-你能发布一个代码示例吗。我的建议都不适用于您吗?我最终从BW继承并在每个线程函数之前设置CurrentCulture…+1以使用区域性标识符而不是区域性名称。这对于将
Spanish-Spanish
Spanish-Spanish
分开是必要的,例如,
0x0C0A
使用国际排序顺序,
0x040A
使用传统排序顺序。REF:重要的是,这是在任何服务注册等之前完成的。否则,它们可能会使用旧的文化创建。