【发布时间】:2011-08-18 12:25:36
【问题描述】:
我设计了一个基于 MVVM 模式的 WPF 应用程序,我需要从 Web 服务获取大量数据,我使用 ViewModel 中的 BackgroundWorker 来完成。要修改可观察的集合,我必须使用调度程序,问题就在这里,即使我通过引用 UI 调度程序它也不起作用,就像我使用内部调度程序并且我的应用程序被冻结,直到所有数据都被检索。
我尝试通过多种方式获取 UI Dispatcher,Dispatcher.CurrentDispatcher、Application.Dispatcher、App.Current.Dispatcher...做了一些研究,我读到它应该可以工作,有人有什么建议吗?
谢谢 马可
更新
这里有一些代码:这就是我将 Dispatcher 传递给 ModelView 的方式
void AppWindow_Loaded(object sender, RoutedEventArgs e)
{
this.DataContext = new ModelViewApplication(System.Windows.Threading.Dispatcher.CurrentDispatcher);
}
那我尝试用这种方式获取数据
public ModelViewApplication(Dispatcher _dispatcher)
{
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(getData);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(completedData);
bw.RunWorkerAsync();
}
public void getData(object sender, DoWorkEventArgs e)
{
_dispatcher.Invoke(DispatcherPriority.Normal,
new Action(
delegate()
{
//Connect to webservice and retrieve data
....
}));
}
多线程好像不行
【问题讨论】:
-
如果您的应用程序被冻结,那么它看起来像是
BackgroundWorker的问题,而不是Dispatcher。向我们展示代码。 -
BackgroundWorker 工作正常,因为如果我只使用不调用 webservice 我没有任何问题,但是如果我尝试在 DoWork 事件中连接到 webservice 我收到错误“调用线程无法访问这个对象,因为不同的线程拥有它”
-
@Marco:问题不在于调度程序坏了——而是您对它的使用可能不正确。贴一些代码。
-
您的代码中有错误。无法从您的问题中看出它在哪里或是什么。您已经知道足以解决您的问题。这里有个提示:创建一个新项目,它只做一件事——从 BackgroundWorker 更新 UI。用尽可能少的代码隔离您的问题。两种情况中的任何一种都会发生:第一,你会弄清楚你做错了什么,你会解决你自己的问题。二,你会遇到同样的问题,但是在这么少的代码中你可以将它粘贴到一个问题中,让我们都看看你在做什么。
-
我贴了一些代码,希望对你有帮助
标签: wpf mvvm backgroundworker dispatcher