m-y*_*m-y 2 data-binding wpf multithreading dispatcher mvvm
即使我使用Dispatcher,我的UI悬挂也有点问题,在我进一步研究之前,我想知道这是否是我处理数据检索的方式.
现在我有我的主窗口创建一个View和ViewModel.然后,在新的Thread内部(使用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();
}
Run Code Online (Sandbox Code Playgroud)
这基本上说它应该创建一个视图和一个视图模型,然后将视图添加到我拥有的标签集合中(这意味着它应该至少显示新标签).而且,它还应该显示一个"工作......"窗口.之后,一个单独的线程应该将ViewModel链接到视图,关注该选项卡并关闭工作窗口.问题是第一部分直到一切都完成后才显示; 直到新线程实际完成后才显示选项卡并且不显示工作窗口(这会导致工作窗口立即显示/关闭).我猜它可能与我检索数据的方式有关,但我不确定.这是它的方式:
你所有额外的线程正在做的是将另一个回调编组回调度程序线程.大概你实际上想要在额外的线程上做工作,或者创建它没有意义.
理想情况下,您的额外线程应该适当地获取所有数据,只允许您在调度程序线程中实际连接它.重要的是确定您需要在UI线程上执行哪些工作以及您需要在后台线程上执行哪些工作.
| 归档时间: |
|
| 查看次数: |
2595 次 |
| 最近记录: |