Как я могу изменить CurrentCulture всего процесса (а не только текущего потока) в .Net?
У меня есть ситуация, когда мне нужно установить локаль моего процесса в en-US.
Я знаю, как это сделать для текущего потока:
System.Threading.Thread.CurrentThread.CurrentCulture =
System.Globalization.CultureInfo.CreateSpecificCulture("en-US");
Но мое приложение использует BackgroundWorkers
для выполнения некоторой обработки, и языковой стандарт для этих рабочих потоков, по-видимому, не влияет на вышеупомянутое изменение на их основной поток нереста.
Итак, как я могу установить языковой стандарт для всех потоков в моем приложении, не устанавливая его вручную?
Ответы
Ответ 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);