异步首次加载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时,它需要一些时间,并且看起来不是真正的异步。对于其他负载,它可以很好地异步工作。我也不知道为什么。有什么建议吗?

异步首次加载TabItem时的性能问题

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

有时看起来是异步的,因为UI线程忙于显示新的选项卡,所以来自后台线程的Invoke阻塞,直到UI线程有时间处理它。当看起来是同步的时候,在显示新选项卡之前,UI线程正在处理Invoke调用。所以,最后,我认为你有一个竞态条件。

要解决这个问题,您可能需要重构您的LoadMyObject方法,以便它可以在后台线程上运行,或者您可以使用Dispatcher。BeginInvoke方法,并为它提供一个较低的优先级,以确保在LoadMyObject调用处理之前显示新选项卡