2012-12-18 39 views
1

我在后台线程中有PRISM的事件订阅。登录后我加载了几个应用程序相关的数据 另外我尝试从Unity Container解析MainMenu。统一容器在后台线程中解决线程

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

这将异常结束。它必须从STA线程调用,因为这些操作与GUID相关。 这似乎完全可以理解的,但

  1. 如果我使用的调度员也没有例外,但它会阻止UI线程,那不是我想要的。
  2. 使用另一个BackgroundWorker或任务工厂不会解决问题,因为它仍然在后台线程。

那么如何在后台线程中加载GUI相关的东西呢?

回答

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(); 
+0

您好,感谢您的帮助。它正在正确加载菜单。但是现在我不能将菜单分配给我的区域,因为它们属于不同的线程。如何解决这个问题? :) 'buttonsRegion.Add(mainMenu,“MainMenu”);' –

+0

看看这是否有帮助[线程之间移动对象](http://stackoverflow.com/questions/2954089/c-sharp-multi-threading-move-对象之间线程) – Blachshma

+0

嗯仍无法正常工作'Application.Current.Dispatcher.BeginInvoke(新行动((菜单)=> \t \t \t \t \t buttonsRegion.Add(菜单 “的MainMenu”) \t \t \t \t ),新对象[] {m​​ainMenu});' –