How to invoke a method on the UI thread from within a worker thread?
我正在研究一个使用以下技术的项目:
我目前正在使用代理生成的begin/end方法对我们的一个Web服务进行异步调用。调用成功,客户端能够在工作线程上接收Web服务的响应。
一旦收到响应,我就开始引发一个事件。订阅事件的类继续使用prism请求用户界面导航:
1 2
| Application .Current.Dispatcher.BeginInvoke(new Action (() =>
this.RegionManager.RequestNavigate(RegionNames .LoginContentRegion, projectSelectionViewUri ))); |
由于异步WCF响应没有在UI线程上捕获,因此我不得不使用Application.Current.Dispatcher.BeginInvoke(...)调用UI线程。
这里的问题是调用似乎什么都不做。用户界面未更新,不会引发异常。
如何从工作线程上引发的事件中调用UI线程?
编辑:此问题已在以下链接中被重新询问,因为假定的副本不提供答案:
在异步WCF响应线程上使用Prism 4请求UI导航
- 为什么这条线是闭合的。可能的副本不涉及WPF窗口,而且已经有近3年的历史了,我知道这是一个常见的主题(站点范围),但可能的副本是不常见的。
- 我同意拉姆霍德的观点…
型
您需要确保调用的是实际的ui Dispatcher,而不是Current。您可以尝试传入ui-Dispatcher,或者在某个地方由ui处理某种形式的回调。
- 如何通过UI调度器?
- 假设您从某个UI元素(即UserControl)创建了需要它的类,那么您可以执行如下操作:var someClass = new SomeClass(this.Dispatcher);。
- @Husseinkhalil-你不能发送主窗口的参考信息吗?
- @Ramhound通过对MainWindow的某个类A引用从来不是一个好的解决方案,除非该类要处理MainWindow的某些部分。如果只是使用Dispatcher,只需通过Dispatcher。
- 我遇到的问题是,需要调度器的类是使用prism创建的(即:它是视图的视图模型),因此我不直接实例化它。我正在使用Unity为它提供使用控制反转所需的所有类引用。我尝试在类的构造函数中请求一个调度器,希望我可以使用控制反转来获得UI调度器(因为类是在UI线程上创建的),但它没有工作。
- @斯莱德-如果你说这不是个好主意,我会相信你的。我这样做的唯一原因是为了获得调度器,这是我使用isyncInvoke的一种方式
- @Husseinkhalil-我想你应该打开一个新的问题。我们需要更多的示例代码。
- 好的,有两个建议:1。创建一些类来包含对ui Dispatcher的静态引用(这不是一种特别好的方法,但是如果处理得当,应该可以足够管理)。2。把你试图使用的IOC代码样本贴出来,我或者其他人可能会进一步帮助你。
- 谢谢拉姆霍德和斯莱德。我喜欢您将UI调度器存储在静态引用中的想法…不过,我不确定这是否是你建议的最好的主意。我创建了一个新问题:stackoverflow.com/questions/8578346/…