Как я могу изменить CurrentCulture всего процесса (а не только текущий поток) in.Net?

у меня есть ситуация, когда мне нужно установить локаль моего процесса в en-US.

Я знаю, как это сделать для текущего потока:

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

но мое приложение использует BackgroundWorkers выполнить некоторую обработку, и локаль для этих рабочих потоков, похоже, не зависит от вышеуказанного изменения их нерестового основного потока.

Итак, как я могу установить языковой стандарт для всех потоков в моем приложении, не устанавливая его в каждом вручную?

4 ответов


вам придется изменить локаль операционной системы, если вы хотите это сделать. По какой причине вы хотите, чтобы BackgroundWorkers работали в en-US?

вы должны иметь свой бизнес-уровень, работающий в инвариантной культуре, и иметь только определенную культуру для пользовательского интерфейса конечного пользователя.

Если вы используете BackgroundWorker компонент, и для этого вы можете попробовать что-то вроде этого в методе 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;
}

с 4.0 вам нужно будет управлять этим самостоятельно, установив культуру для каждого потока. Но с 4.5 вы можете определить культуру для appdomain, и это предпочтительный способ справиться с этим. Соответствующие API являются CultureInfo.DefaultThreadCurrentCulture и CultureInfo.DefaultThreadCurrentUICulture.


используйте этот:

worker.RunWorkerAsync(Thread.CurrentThread.CurrentCulture.LCID);//Pass the LCID as argument

после работы сделайте это:

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

мы используем вспомогательный класс для BackgroudWorker такой:

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