TabItem的异步第一个Load的性能问题

时间:2011-09-19 14:14:00

标签: c# .net wpf mvvm asynchronous

当我加载TabItem时,我的应用程序存在性能问题(每个TabItem绑定到ViewModel,每个ViewModel都有一个DataTemplate)。为了解决这个问题,我在ViewModel构造函数中使用异步加载:

public MyViewModel(MyObject entity)
    {
       // WpfContext it's my Dispatcher
       Task.Factory.StartNew(() => WpfContext.Invoke(() =>
                                   {
                                       //Initialisation
                                       LoadMyObject(entity);
                                   }));
    }

使用此解决方案,第一次加载TabItem时,需要一些时间,而且似乎并非真正异步。对于其他负载,它工作良好且异步。我不知道为什么。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

Dispatcher上的

Invoke是对Task的后台线程以及UI线程(一旦它决定实际运行代码)的阻塞调用。

有时似乎是异步的,因为UI线程忙于显示新的Tab,因此后台线程中的Invoke阻塞,直到UI线程有时间处理它。当看起来它是同步的时,在显示新Tab之前,UI线程正在处理Invoke调用。所以,最后,我认为你有竞争条件。

要解决此问题,您可能需要重构LoadMyObject方法,以便可以在后台线程上运行,或者您可以使用Dispatcher.BeginInvoke方法并为其提供较低的优先级以确保显示您的新标签页在处理LoadMyObject电话

之前