【发布时间】:2023-03-05 20:58:01
【问题描述】:
即使我使用的是 Dispatcher,我的 UI 挂起也有一点问题,在进一步了解之前,我想知道这是否是我处理数据检索的方式。
现在我的主窗口创建了一个 View 和 ViewModel。然后,在一个新线程内部(使用 Dispatcher),它设置 View.DataContext = ViewModel。当绑定启动时会延迟创建一个非常大的 ObservableCollection,从而导致速度减慢。但是,似乎应该在该减速之前显示的其他一些 UI 项目实际上并未显示。
private void ButtonClick(Object sender, RoutedEventArgs e)
{
MyView view = new MyView();
MyViewModel vm = new MyViewModel();
TabItem tabItem = new TabItem();
tabItem.Header = "MyView";
tabItem.Content = view;
MyTabCollection.Items.Add(tabItem);
Window working = new Working();
working.Show();
ThreadStart thread = delegate()
{
DispatcherOperation operation = Dispatcher.BeginInvoke(
DispatcherPriority.Normal,
new Action(delegate()
{
view.DataContext = vm;
((FrameworkElement)view.Parent).Focus();
working.Close();
}
)
);
};
Thread theThread = new Thread(thread);
theThread.Start();
}
这基本上是说它应该创建一个视图和一个视图模型,然后将视图添加到我拥有的选项卡集合中(这意味着它至少应该显示新选项卡)。而且,它还应该显示一个“工作...”窗口。之后,应该有一个单独的线程将 ViewModel 链接到视图,关注该选项卡并关闭工作窗口。问题是第一部分直到一切都完成后才会显示;直到新线程实际完成后(这导致工作窗口立即显示/关闭),该选项卡才会显示,工作窗口也不会显示。我猜这可能与我检索数据的方式有关,但我不确定。这是它的做法:
- 创建视图
- 创建视图模型
- 创建 TabItem 并将 Content 设置为 View,并将 TabItem 添加到 TabCollection。
- 创建/显示“工作...”窗口
- 调度程序:设置 View.DataContext = ViewModel。此事件触发 DataBindings,后者又获取 ObservableCollection。由于 OC 是延迟创建的,因此现在正在创建它(这是瓶颈)。
- 调度程序:将焦点设置到选项卡
- 关闭“工作中...”窗口
【问题讨论】:
标签: wpf multithreading data-binding mvvm dispatcher