Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从工作线程中调用UI线程上的方法?_C#_Wpf_Multithreading_Wcf_Prism - Fatal编程技术网

C# 如何从工作线程中调用UI线程上的方法?

C# 如何从工作线程中调用UI线程上的方法?,c#,wpf,multithreading,wcf,prism,C#,Wpf,Multithreading,Wcf,Prism,我正在从事一个使用以下技术的项目: C#(.NET 4.0) 周转基金 棱镜4 我目前正在使用代理生成的Begin/End方法对我们的一个Web服务进行异步调用。调用成功,客户端能够在工作线程上接收Web服务的响应 收到响应后,我继续提出一个事件。订阅事件的类继续使用PRISM请求UI导航: Application.Current.Dispatcher.BeginInvoke(new Action(() => this.RegionManager.RequestNavigate

我正在从事一个使用以下技术的项目:

  • C#(.NET 4.0)
  • 周转基金
  • 棱镜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线程

编辑:此问题已在以下链接中重新提出,因为假定的副本未提供答案:


您需要确保在实际的UI
调度程序上调用,而不一定是当前的
调度程序。您可以尝试传入UI
调度程序
,或者让UI在某个地方处理某种形式的回调。

我如何传递UI调度程序?假设您从某个UI元素(即
用户控件
)创建需要它的类,您可以执行以下操作:
var someClass=new someClass>(这是调度员);
@Ramhound将某个类a引用传递到
主窗口
永远不是一个好的解决方案,除非该类将处理
主窗口的某个部分。如果只是使用
调度程序
,您只需要通过
调度程序
@Slade-如果您说这不是一个好方法,我相信您想法。我这样做的唯一原因是为了得到调度程序,这是我使用ISyncInvokOk的一种方法,有两个建议:1.创建一些类来包含对UI
dispatcher
的静态引用(这不是一个特别好的方法,但如果做得好,应该足够容易管理).2.发布您尝试使用的IoC代码示例,我或其他人可能会提供进一步帮助。为什么关闭此线程。可能的副本不涉及WPF窗口,并且已经有近3年的历史,我知道这是一个常见的主题(站点范围),但可能的副本并不常见。我同意Ramhound。。。