Изменение CultureInfo основного потока из рабочего потока - PullRequest
2 голосов
/ 21 июля 2010

Можно ли изменить CurrentUICulture основного потока при возникновении события в рабочем потоке?

Код для иллюстрации:

static void Main()
{
   //do something

  Thread workerThread = new Thread(new ThreadStart(DoWork));
  workerThread.Start();

  //do something
}

void DoWork()
{
   ConnectDatabase();

   //do some work

   ChangeLanguage(lang);

}

void ChangeLanguage(string lang)
{
   //this line changes Culture only  for worker thread
   System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.CreateSpecificCulture(lang);

}

Ответы [ 3 ]

1 голос
/ 21 июля 2010

Это клиентское приложение WinForm и пользовательские настройки хранятся в базе данных. Рабочий поток соединяет базу данных (это занимает некоторое время). После успешного подключения приложение должно установить язык в соответствии с настройками пользователя.

Когда ваш поток завершает работу, он может использовать MainForm.Invoke(helperMethod), а затем helperMethod запускается в основном потоке и может безопасно устанавливать культуру.

A backgroundworker сделает это еще проще. У него есть событие Completed, которое запускается в главном потоке.

1 голос
/ 21 июля 2010

Вам нужно, чтобы рабочий поток знал о главном потоке, чтобы он мог делать:

mainThread.CurrentUICulture = ...;

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

Почему бы не иметь метод, который вы можете вызывать в главном потоке (например, используя Control.Invoke, если вы используете Windows Forms - здесь контекст не ясен), который позволит основному потоку изменять свою собственную культуру в контролируемым образом, перезагружая ресурсы по мере необходимости и т. д.

0 голосов
/ 21 июля 2010

Вам нужно вызвать межпотоковый обратный вызов, если ваше приложение является приложением WinForms, то вы можете использовать ISyncronizedInvoke (это реализуется любым элементом управления WinForms).

Если нет, вы можете использовать кросс-контекстный обратный вызов:

static void Main()
{
  Thread workerThread = new Thread(new ParameterizedThreadStart(DoWork));
  workerThread.Start(Thread.CurrentContext);
}

void DoWork(object state)
{
   ConnectDatabase();

   //do some work

   ((Context)state).DoCallBack(() => Thread.CurrentThread.CurrentUICulture = ...);
}
...