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

C# TabItem异步首次加载时的性能问题,c#,.net,wpf,mvvm,asynchronous,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(()

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

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

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

在调度程序上调用是对任务的后台线程和UI线程(一旦它决定实际运行代码)的阻塞调用

有时它看起来是异步的,因为UI线程正忙于显示新选项卡,因此后台线程的
调用
会一直阻塞,直到UI线程有时间处理它。如果看起来是同步的,则在显示新选项卡之前,UI线程正在处理调用。所以,最后,我认为你有一个比赛条件


要解决此问题,您可能需要重构
LoadMyObject
方法,以便它可以在后台线程上运行,或者您可以使用此方法并为其提供较低的优先级,以确保在处理
LoadMyObject
调用之前显示新选项卡,这到底是什么意思“您可能需要重构LoadMyObject" ? 当我使用Task.Factory.StartNew创建后台任务以调用LoadMyObject时,没有任何更改。。。我还尝试了BeginInvoke,但我的TabItem保持为空。因为我不知道
LoadMyObject
实际上做了什么,我认为这是一个长期运行的方法,也导致事件通知WPF更新显示以呈现新数据。我想您可以重构它,在后台线程上执行长时间运行的部分,然后仅在需要时调用UI。现在,启动任务不会改变任何事情,因为它会立即调用
Invoke
,这只会返回到UI线程。