在WPF MVVM中,如何生成在UI线程上运行回调的后台任务?

时间:2009-08-21 16:44:30

标签: wpf multithreading events mvvm

我熟悉控件的调度程序对象,但这并不能解决我在MVVM场景中的问题。

我有一个UI命令,它调用我的VM上的一个方法,它产生一个线程然后返回,当线程完成时(后台工作者可能对此有好处?)它会引发一个回调,但是诀窍是,该回调修改了一个可观察的集合,那么如何在UI线程上引发这个回调呢?

4 个答案:

答案 0 :(得分:4)

使用与UI线程关联的Dispatcher。通常,您会有base ViewModel class向所有子类公开Dispatcher。然后你的VM会做类似的事情:

Dispatcher.Invoke((ThreadStart) delegate
{
    //this code executes on the UI thread
});

答案 1 :(得分:1)

如果回调方法位于可以访问Dispatcher的表单或控件中,则可以调用CheckAccess()。如果你在同一个线程上,那就去做吧。否则,使用调度程序将委托发布到执行函数,该函数将在正确的线程上。

答案 2 :(得分:1)

后台工作人员将为此工作。

至于在UI线程上发布您的更改,您需要做的就是将调用绑定到您的调度程序,并使用dispatcher.Invoke实际更改可观察集合。

这就是为什么让ViewModel类保持对调度程序的引用几乎总是非常方便。这使得这种模式非常容易实现。

答案 3 :(得分:0)

BackgroundWorker对此非常适合,因为它根据RunWorkerCompleted(在WPF中取决于当前的调度程序)在适当的线程上引发SynchronizationContext事件

另一种选择是在执行异步操作之前保存当前的调度程序(Dispatcher.CurrentDispatcher),以便您可以使用它来调用回调。

我写了一个类来处理可观察集合的这类问题,你可以找到它here