Как я могу изменить 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);