在执行其他操作时从另一个线程刷新窗口?

时间:2011-09-23 05:46:27

标签: c# .net wpf c#-4.0 .net-4.0

我一直试图在应用程序加载其初始数据时保持应用程序的启动画面不挂起,但是我还没有成功地找到这样做的方法。

以下是我尝试的代码:

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

有人可以告诉我如何做到这一点吗?

谢谢, 亚历克斯。

1 个答案:

答案 0 :(得分:2)

  1. 在后台线程中加载所有数据(模型/视图模型)(如BackgroundWorker)。
  2. Dispatcher.Invoke()将挂起您的UI线程,因为多次调用会因同步执行代码而阻塞。请改用Dispatcher.BeginInvoke()。它更有效地使用调度程序队列。
  3. 使用DispatcherPriority对您有利。任何具有较低重要性的Splash UI通知都可以显示在更高优先级的通知之后。
  4. 如果您想要优先通知Splash,请使用Dispatcher.PushFrames()
  5. 在多个后台线程中拆分数据加载,并使用Wait / Pulse在较慢的完成时通知其他人。不相关的数据可以加载到不同的线程中,例如可以使用不同的线程加载财务相关数据和员工相关数据。