异步首次加载TabItem时的性能问题
本文关键字:性能 问题 TabItem 加载 异步 | 更新日期: 2023-09-27 18:08:56
我的应用程序有一个性能问题,当我加载一个TabItem(每个TabItem绑定到一个ViewModel,每个ViewModel有一个DataTemplate)。为了解决这个问题,我在ViewModel构造函数中使用异步加载:
public MyViewModel(MyObject entity)
{
// WpfContext it's my Dispatcher
Task.Factory.StartNew(() => WpfContext.Invoke(() =>
{
//Initialisation
LoadMyObject(entity);
}));
}
使用这种解决方案,第一次加载TabItem时,它需要一些时间,并且看起来不是真正的异步。对于其他负载,它可以很好地异步工作。我也不知道为什么。有什么建议吗?
Dispatcher上的Invoke
是对Task的后台线程和UI线程(一旦它决定实际运行你的代码)的阻塞调用。
有时看起来是异步的,因为UI线程忙于显示新的选项卡,所以来自后台线程的Invoke
阻塞,直到UI线程有时间处理它。当看起来是同步的时候,在显示新选项卡之前,UI线程正在处理Invoke调用。所以,最后,我认为你有一个竞态条件。
要解决这个问题,您可能需要重构您的LoadMyObject
方法,以便它可以在后台线程上运行,或者您可以使用Dispatcher。BeginInvoke方法,并为它提供一个较低的优先级,以确保在LoadMyObject
调用处理之前显示新选项卡