在执行其他操作时从另一个线程刷新窗口
本文关键字:另一个 线程 刷新 窗口 执行 其他 操作 | 更新日期: 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();
谁能告诉我如何做到这一点?
谢谢,亚历克斯。
- 将所有数据(模型/视图模型)加载到后台线程(如
BackgroundWorker
)。 -
Dispatcher.Invoke()
将挂起您的UI线程,因为多个调用将由于代码的同步执行而阻塞。使用Dispatcher.BeginInvoke()
代替。它更有效地使用分派器队列。 - 使用
DispatcherPriority
对你有利。任何重要性较低的Splash UI通知都可以显示在优先级较高的通知之后。 - 使用
Dispatcher.PushFrames()
如果你想通知Splash优先级的东西。 - 将数据加载在多个后台线程中,并使用
Wait
/Pulse
在较慢的线程完成时通知其他线程。不相关的数据可以在不同的线程中加载,例如财务相关数据和员工相关数据可以使用不同的线程加载。