2011-09-23 58 views
1

我一直在試圖保持我的應用程序的啓動畫面掛起,而應用程序加載其初始數據,但我還沒有成功找到一種方法來做到這一點。執行其他操作時刷新另一個線程的窗口?

這是我曾嘗試代碼:

SplashView splashScreen = new SplashView(); 
      new Thread((ThreadStart)delegate 
      { 
       splashScreen.Dispatcher.Invoke((Action)delegate 
       { 
        while ((bool)splashScreen.Dispatcher.Invoke((Func<SplashView, bool>)delegate(SplashView sView) { return sView.IsEnabled; }, DispatcherPriority.Render, new object[] { splashScreen })) 
        { 
         splashScreen.Dispatcher.Invoke((Action<SplashView>)delegate(SplashView sView) { sView.UpdateLayout(); }, DispatcherPriority.Render, new object[] { splashScreen }); 
         Thread.Sleep(10); 
        } 
       }, DispatcherPriority.Render, new object[] { }); 
      }).Start(); 

可有人請告訴我如何做到這一點?

謝謝, 亞歷克斯。

回答

2
  1. 在後臺線程(如BackgroundWorker)上加載所有數據(模型/視圖模型)。
  2. Dispatcher.Invoke()將掛起您的UI線程,因爲多個調用會因爲代碼的同步執行而被阻塞。改爲使用Dispatcher.BeginInvoke()。它更有效地使用調度程序隊列。
  3. 使用DispatcherPriority您的優勢。任何重要性較低的Splash UI通知可能會顯示在更高優先級的通知之後。
  4. 如果您想要通知Splash優先級別,請使用​​。
  5. 在多個後臺線程中拆分您的數據加載並使用Wait/Pulse在較慢的結束時通知其他人。無關的數據可以在不同的線程中加載,例如財務相關數據和員工相關數據可以使用不同的線程加載。
+0

我不能在單獨的線程中進行加載,因爲它使用數據填充可觀察的集合,這些數據不是多線程的,您是否也可以給我一些示例? –

+0

只有當它們已經綁定到項目控件並且thrad安全可觀察集合已經存在時(儘管它們實際上並不是多線程的) /2007/04/22/Thread-safe-observable-collection.aspx ....還有很多關於WPF啓動畫面加載的例子這個例子使用'PushFrames()'http://www.codeproject.com/KB/WPF/WPFsplashscreen.aspx ....這個例子使用多線程與脈衝/等待使用'AutoResetEvent' ... http:// szymonrozga達網絡/博客/ p = 136。 –

+0

關於使ObservableCollection線程安全的帖子非常有幫助謝謝! –

相關問題