如何从工作线程中调用 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 线程上的方法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何从线程更新 UI?

从非 UI 线程调用 Snackbar.make() 是如何工作的?

即使从主线程调用更新,UI 也不会更新

多线程文件复制比多核CPU上的单个线程慢得多

java Servlet 的多线程如何工作? [复制]

工作线程无法更新 Motorola V3 上的 UI