2011-09-23 60 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线程安全的帖子非常有帮助谢谢! –

相关问题