当我加载TabItem时,我的应用程序存在性能问题(每个TabItem绑定到ViewModel,每个ViewModel都有一个DataTemplate)。为了解决这个问题,我在ViewModel构造函数中使用异步加载:
public MyViewModel(MyObject entity)
{
// WpfContext it's my Dispatcher
Task.Factory.StartNew(() => WpfContext.Invoke(() =>
{
//Initialisation
LoadMyObject(entity);
}));
}
使用此解决方案,第一次加载TabItem时,需要一些时间,而且似乎并非真正异步。对于其他负载,它工作良好且异步。我不知道为什么。有什么建议吗?
答案 0 :(得分:1)
Invoke
是对Task的后台线程以及UI线程(一旦它决定实际运行代码)的阻塞调用。
有时似乎是异步的,因为UI线程忙于显示新的Tab,因此后台线程中的Invoke
阻塞,直到UI线程有时间处理它。当看起来它是同步的时,在显示新Tab之前,UI线程正在处理Invoke调用。所以,最后,我认为你有竞争条件。
要解决此问题,您可能需要重构LoadMyObject
方法,以便可以在后台线程上运行,或者您可以使用Dispatcher.BeginInvoke方法并为其提供较低的优先级以确保显示您的新标签页在处理LoadMyObject
电话