WPF Dispatcher,后台工作人员和很多痛苦

标签 wpf mvvm multithreading backgroundworker dispatcher

好的,这可能真的很简单,但我尝试的一切似乎都碰壁了。

我有一个具有两个属性的 View 模型,它们绑定(bind)到我的 WPF 表单:

 bool IsWorking {get;set;}
 ObservableCollection<OtherViewModel> PendingItems {get;set;}

我有一个方法,我调用它来从 Outlook 中获取一些新的待处理项目,但是我还要在表单上显示某种进度(旋转进度条),进度条可见性绑定(bind)到 ViewModel 上的 IsWorking 属性,并且网格绑定(bind)到 PendingItems 集合。

我希望能够将 IsWorking 设置为 true,以便 UI 可以显示进度条,在后台运行工作,然后在完成后将 IsWorking 设置为 false,这样进度条就会消失。

我创建了一个类似这样的背景 worker :
        worker = new BackgroundWorker();
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
        worker.RunWorkerAsync();

现在 worker_DoWork 调用获取挂起项目并将它们添加到 PendingItems 集合的方法,一切都在后台运行,UI 仍然响应但我在尝试添加到集合时得到正常的跨线程错误。我将更改集合的代码包装在调度程序调用中:
        // Update to show the status dialog.
        Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Render,
                            new Action(delegate()
                            {
                                this.PendingItems.Add(\\Blah);
                            })
                          );

但它仍然会引发相同的跨线程错误。

我对线程不是很好,所以我不知道我可能做错了什么,有人可以帮我解决这个问题吗?

最佳答案

看看here有关其他人如何创建线程安全的可观察集合的信息(因此您不必这样做)。

关于WPF Dispatcher,后台工作人员和很多痛苦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2241230/

相关文章:

c# - 如何使用资源构建独立的exe?

c# - 将命令绑定(bind)到子 ViewModel

wpf - 覆盖注册名称

ios - iOS 中的 MVVM 模型

ios - 在 RxSwift 中从 ViewModel 获取字符串到 View

java - 如何运行多个java运行时作业并等待所有作业完成?

Java - volatile 和可见性

.net - 在 Windows Vista/7 中重定向应用程序的图形输出(使用 DWM)

c++ - c++进入临界区和上下文切换

c# - 关于接口(interface)实现和可扩展性的架构问题