如何在工作线程中调用UI线程上的方法?

18

我正在开发一个项目,使用以下技术:

  • C# (.NET 4.0)
  • WCF
  • PRISM 4

我目前正在使用代理生成的Begin/End方法对我们的Web服务进行异步调用。调用成功后,客户端能够在工作线程上接收到Web服务的响应。

一旦收到响应,我继续触发一个事件。订阅该事件的类使用PRISM请求UI导航:

Application.Current.Dispatcher.BeginInvoke(new Action(() =>
    this.RegionManager.RequestNavigate(RegionNames.LoginContentRegion, projectSelectionViewUri)));

由于异步 WCF 响应未在 UI 线程上捕获,我被迫使用 Application.Current.Dispatcher.BeginInvoke(...) 调用 UI 线程。

问题在于调用似乎没有任何作用。UI 没有更新,并且没有抛出异常。

如何从工作线程引发的事件中调用 UI 线程?

编辑:由于所谓的重复问题未提供答案,因此已将此问题重新提出,链接如下:

Request UI navigation using PRISM 4 on an asynchronous WCF response thread


2
为什么这个线程被关闭了。可能的重复问题与WPF Windows无关,而且已经将近3年了。我知道这是一个常见的主题(整个网站都是),但是可能的重复问题没有任何共同点。 - Security Hound
我同意Ramhound的看法... - Hussein Khalil
1个回答

10

你需要确保在实际的 UI Dispatcher 上调用,而不一定是 Current。你可以尝试传递 UI Dispatcher,或者有某种形式的回调函数将由 UI 处理。


我该如何传递UI调度程序? - Hussein Khalil
1
假设您从某个 UI 元素(例如 UserControl)创建需要它的类,您可以这样做:var someClass = new SomeClass(this.Dispatcher); - Samuel Slade
1
@Ramhound 将某个类的引用传递给“MainWindow”从来不是一个好的解决方案,除非该类将处理“MainWindow”的某些部分。如果只是使用“Dispatcher”,则只需要通过“Dispatcher”传递即可。 - Samuel Slade
1
@Slade - 当你说这不是个好主意时,我会相信你。我之所以考虑这么做,只是为了获取调度程序,这是我使用ISyncInvok的一种方式。 - Security Hound
1
好的,我有两个建议:1. 创建一个包含对UI“Dispatcher”的静态引用的类(虽然这不是一个很好的方法,但如果正确使用,应该还是可行的)。2. 发布你尝试使用的IoC代码示例,我或其他人可能能提供进一步的帮助。 - Samuel Slade
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接