如何从工作线程中调用 UI 线程上的方法? [复制]
Posted
技术标签:
【中文标题】如何从工作线程中调用 UI 线程上的方法? [复制]【英文标题】:How to invoke a method on the UI thread from within a worker thread? [duplicate] 【发布时间】:2012-01-24 13:25:55 【问题描述】:我正在开发一个使用以下技术的项目:
C# (.NET 4.0) WCF 棱镜 4我目前正在使用代理生成的 Begin/End 方法对我们的一个 Web 服务进行异步调用。调用成功,客户端能够在工作线程上接收 Web Service 的响应。
收到响应后,我会继续引发事件。订阅事件的类继续使用 PRISM 请求 UI 导航:
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
this.RegionManager.RequestNavigate(RegionNames.LoginContentRegion, projectSelectionViewUri)));
由于未在 UI 线程上捕获异步 WCF 响应,我不得不使用 Application.Current.Dispatcher.BeginInvoke(...)
调用 UI 线程。
这里的问题是调用似乎什么都不做。 UI 没有更新,也没有抛出异常。
我应该如何从工作线程上引发的事件中调用 UI 线程?
编辑:此问题已在以下链接中重新提出,因为假定的重复项没有提供答案:
Request UI navigation using PRISM 4 on an asynchronous WCF response thread
【问题讨论】:
为什么这个帖子被关闭了。可能的重复不处理 WPF Windows,并且已经将近 3 年了,我知道这是一个常见的主题(站点范围),但可能的重复没有什么不常见的。 我同意 Ramhound... 【参考方案1】:您需要确保在实际 UI Dispatcher
上调用,不一定是 Current
。您可以尝试传入 UI Dispatcher
,或者有某种形式的回调,由 UI 在某处处理。
【讨论】:
我将如何通过 UI Dispatcher ? 假设您从某个 UI 元素(即UserControl
)创建需要它的类,您可以执行以下操作:var someClass = new SomeClass(this.Dispatcher);
。
@Ramhound 向某个类传递对MainWindow
的引用绝不是一个好的解决方案,除非该类将处理MainWindow
的某些部分。如果只是单纯的使用Dispatcher
,则只需要通过Dispatcher
即可。
@Slade - 当你说这不是一个好主意时,我会相信你。我这样做的唯一原因是为了获得调度程序,这是我使用 ISyncInvok 的一种方式
好的,有两个建议: 1. 创建一些类以包含对 UI Dispatcher
的静态引用(不是特别好的方法,但如果做得好应该足够易于管理)。 2. 发布您尝试使用的 IoC 代码示例,我或其他人可能会提供进一步帮助。以上是关于如何从工作线程中调用 UI 线程上的方法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章