У меня есть подписка на мероприятие от PRISM в фоновой теме. После входа в систему я загружаю несколько данных, связанных с приложением. Также я пытаюсь разрешить MainMenu из контейнера Unity.

MainMenu mainMenu = container.Resolve<MainMenu>();

Это закончится исключением. Он должен вызываться из потока STA, поскольку операции связаны с графическим интерфейсом пользователя. Это кажется совершенно понятным, но

  1. Если я использую Диспетчер, исключения нет, но он блокирует поток пользовательского интерфейса, это не то, что я хочу.
  2. Использование другого BackgroundWorker или Task Factory не решит проблему, потому что он все еще находится в фоновом режиме Thread.

Итак, как мне загрузить материалы, связанные с графическим интерфейсом пользователя, в фоновый поток?

2
Johannes Wanzek 18 Дек 2012 в 17:39

1 ответ

Лучший ответ

Попробуйте создать поток с помощью STA ApartmentState:

Thread uiThread = new Thread(() =>
{
    mainMenu = container.Resolve<MainMenu>();

    // Allow the main UI thread to proceed 
    System.Windows.Threading.Dispatcher.Run();     
});               
uiThread.SetApartmentState(ApartmentState.STA);
uiThread.IsBackground = true;
uiThread.Start();
1
Blachshma 18 Дек 2012 в 17:57
Привет, спасибо за помощь. Меню загружается правильно. Но теперь я не могу назначить меню своему региону, потому что они принадлежат разным потокам. Как это решить? :) buttonsRegion.Add(mainMenu, "MainMenu");
 – 
Johannes Wanzek
18 Дек 2012 в 18:04
Посмотрите, помогает ли это перемещать объекты между потоками
 – 
Blachshma
18 Дек 2012 в 18:12
Хммм все еще не работает Application.Current.Dispatcher.BeginInvoke(new Action<MainMenu>((menu) => buttonsRegion.Add(menu, "MainMenu") ), new object[] { mainMenu });
 – 
Johannes Wanzek
18 Дек 2012 в 19:02