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

本文关键字:另一个 线程 刷新 窗口 执行 其他 操作 | 更新日期: 2023-09-27 18:09:21

我一直试图保持启动屏幕为我的应用程序挂起,而应用程序加载其初始数据,但是我还没有成功地找到一种方法来做到这一点。

下面是我试过的代码:

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