Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

Вам нужно будет изменить локаль операционной системы, если вы хотите это сделать. По какой причине вы хотите, чтобы 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;
}

Ответ 2

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

Ответ 3

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

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

после этого сделайте это:

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

Ответ 4

Мы используем вспомогательный класс для 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);