2008-10-09 4 views
0

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

Приложение представляет собой приложение для установки с окнами. Приложение запускает фонового работника для выполнения и сброса IIS, а затем устанавливает MSI.

При первом запуске приложения на виртуальной машине Win Win 2003 Server формы отображаются на испанском, но не в сообщениях BWP. Если я снова запустил его, сообщения будут на испанском.

Файлы .Resources являются встроенными ресурсами и извлекаются в каталог temp при запуске приложения.

Мой код извлекает локализованные строки через пользовательский класс менеджера ресурсов. Этот класс создает ресурс на основе файлов в файлах .Resources в каталоге temp. Это работает правильно, потому что окна формируют метки и заголовок локализованы каждый раз.

Кто-нибудь испытал это? Я абсолютно застрял, пожалуйста, помогите. Спасибо, Andrew

+0

Это было некоторое время, так как я задал этот вопрос, но я считаю, решение заключалось в том, чтобы сначала извлечь файлы ресурсов в каталог temp Windows, прежде чем запускать BWP и использовать CurrentUICulture для сообщений. – 2008-11-19 17:31:29

ответ

1

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

http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.currentculture.aspx

http://msdn.microsoft.com/en-us/library/system.threading.thread.currentculture.aspx

Я не уверен, что рекомендуемая практика для перенося культуры данные по потокам, хотя.

4

Если UIThread запускает другую UICulture, чем ваш BackgroundWorker вы можете явно изменить культуру рабочего потока с помощью обратного вызова, как это:

 private delegate CultureInfo GetUICultureCallback(); 

     private CultureInfo GetUICulture() 
     { 
      if (this.InvokeRequired) 
      { 
       return (CultureInfo)this.Invoke(new GetUICultureCallback(GetUICulture)); 
      } 

      return System.Threading.Thread.CurrentThread.CurrentUICulture; 
     } 

     void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
     { 
      System.Threading.Thread.CurrentThread.CurrentUICulture = GetUICulture(); 

      for (; ;) 
      { 
       if (backgroundWorker.CancellationPending) 
       { 
        e.Cancel = true; 
        return; 
       } 
. 
. 
. 
Смежные вопросы