Справка по локализации фоновых рабочих процессов .Net

#.net #localization #process #background #worker

Вопрос:

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

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

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

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

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

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

Комментарии:

1. Прошло некоторое время с тех пор, как я задавал этот вопрос, но я считаю, что решением было сначала извлечь файлы ресурсов во временный каталог Windows перед запуском BWP и использовать CurrentUICulture для сообщений.

Ответ №1:

Если ваш 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;
                }
.
.
.
 

Ответ №2:

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

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

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

Однако я не уверен, какова рекомендуемая практика передачи информации о культуре между потоками.