2013-07-25 26 views
3

後臺運行的動畫閃屏:如何在同一時間,在STA一個引導程序線程

我對使用MEF框架來自動鏈接必要的庫和組件的應用程序一個WPF應用程序的工作。隨着人們添加自己的組件,在較慢的機器上,加載需要從0-2秒到6-7秒。爲此,我認爲一個不錯的啓動畫面讓用戶知道應用程序正在加載是必要的。理想情況下,啓動屏幕將顯示動畫進度條以及描述正在加載哪些組件的狀態文本字段。

問題:

我設計是正確的,在該應用程序(OnStartup)的開始被稱爲一個初始屏幕窗口,隨後MEF引導程序的加載。問題當然是,窗口不會動畫,因爲它與MEF引導程序加載在同一個線程上。我試着把bootstrapper放在一個單獨的線程上,但它抱怨說它不是一個STA線程。即使在STA線程上,它仍然不喜歡它,並且在嘗試加載主應用程序窗口時拋出錯誤。 我不能將啓動畫面窗口本身放在一個單獨的線程上,因爲那樣我就無法訪問它,並且它也必須是STA線程,因爲它是一個UI組件。(意識到這是不真實的,我可以跟線程)

更新

我找到了一個解決方案,我不停的閃屏窗口在一個單獨的STA線程。謝謝大家誰回答指着我在正確的方向:

protected override void OnStartup(StartupEventArgs e) 
    { 
     base.OnStartup(e); 

     Dispatcher threadDispacher = null; 
     Thread thread = new Thread((ThreadStart)delegate 
     { 
      threadDispacher = Dispatcher.CurrentDispatcher; 
      SynchronizationContext.SetSynchronizationContext(new DispatcherSynchronizationContext(threadDispacher)); 

      loadingWindow = new LoadingWindow(); 
      loadingWindow.Closed += (s, ev) => threadDispacher.BeginInvokeShutdown(DispatcherPriority.Background); 
      loadingWindow.Show(); 

      System.Windows.Threading.Dispatcher.Run(); 
     }); 

     thread.SetApartmentState(ApartmentState.STA); 
     thread.IsBackground = true; 
     thread.Start(); 

     var bootstrapper = new Bootstrapper(); 
     bootstrapper.Run(); 

     if (threadDispacher != null) 
     { 
      threadDispacher.BeginInvoke(new Action(delegate { loadingWindow.Close(); })); 
     } 
    } 
+2

爲什麼你不能夠訪問它,如果它是一個單獨的線程?你應該仍然可以引用它,你只需要保護你的UI訪問並使用Dispatcher來將調用編組到窗口的UI線程中。 –

回答

0

你是正確的方式引導程序移動到它自己的線程。 但是,您應該做的是確保UI線程上需要執行的部分也是在UI線程上調用的

因此,當完成MEF引導程序時,即使是從MEF的線程,也可以調用主窗口的隱藏窗口並打開主窗口。

的一種方式傳達給主線程讓你的信息是通過dispatcher

相關問題