我熟悉控件的调度程序对象,但这并不能解决我在MVVM场景中的问题。
我有一个UI命令,它调用我的VM上的一个方法,它产生一个线程然后返回,当线程完成时(后台工作者可能对此有好处?)它会引发一个回调,但是诀窍是,该回调修改了一个可观察的集合,那么如何在UI线程上引发这个回调呢?
答案 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