我正在构建一个WPF应用程序。我正在与服务器端进行一些异步通信,我在客户端上使用Prism进行事件聚合。这两件事导致产生新的线程,而不是UI线程。如果我尝试在这些回调和事件处理程序线程上执行“WPF操作”,那么世界将会崩溃,现在它已经开始了。
首先,我遇到了尝试在服务器回调中创建一些WPF对象的问题。我被告知线程需要在STA模式下运行。现在我正在尝试更新Prism事件处理程序中的一些UI数据,我被告知:
调用者无法访问此线程,因为其他线程拥有该线程。
因此; 在WPF中解决问题的关键是什么?我已经在this MSDN post中阅读了WPF调度程序。我开始明白了,但我还没有巫师。
有人想为我清理事情吗?任何相关的建议等?谢谢!
答案 0 :(得分:37)
逐一回答你的每个问题:
Invoke
一切。关键是只在必要时才调用UI线程。为此,您可以使用Dispatcher.CheckAccess方法。Invoke
。话虽如此,在某些方面它是不可避免的,所以不,我不会说这是不好的做法。这只是你不时会遇到的问题的一种解决方案。Dispatcher.CurrentDispatcher
。对于复杂的情况,这可能还不够,但我(个人)还没有看到它们。Dispatcher
可用于访问应用程序的UI线程。但它本身并不是UI线程。BackgroundWorker
通常在您执行耗时的操作时使用,并且希望在后台运行该操作时维护响应式UI。通常,您不使用Invoke的BackgroundWorker 而不是,而是将BackgroundWorker 与 Invoke结合使用。也就是说,如果您需要更新BackgroundWorker中的某个UI对象,则可以调用UI线程,执行更新,然后返回到原始操作。关于BackgroundWorker
有很多话要说,我相信很多问题已经付诸实施,所以我不会深入探讨。如果您感到好奇,请查看MSDN page for BackgroundWorker class。