在异步WCF响应线程上使用PRISM 4请求UI导航



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

  • c#(。NET 4.0)
  • WCF
  • 棱镜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不更新,也不抛出异常。

使用分派器尝试调用的类是视图的视图模型。它是使用控制反转(与UNITY容器)创建的。

下面是视图的构造函数,它请求视图模型:

    public CredentialsInputView(ICredentialsInputViewModel viewModel)
    {
        InitializeComponent();
        ViewModel = viewModel;
        ...
    }

前面的代码导致调用View-Model的构造函数。我尝试将调度程序存储在VM的构造函数调用中,但是稍后使用它来调用UI导航似乎没有帮助。我认为视图模型不是在UI线程上创建的:

    private static System.Windows.Threading.Dispatcher dispatcher;
    /// <summary>
    /// Initializes a new instance of the <see cref="CredentialsInputViewModel"/> class. 
    public CredentialsInputViewModel(ICodexLoginService codexLoginService, ISessionService sessionService, IRegionManager regionManager)
    {
        dispatcher = Application.Current.Dispatcher;
        ...
    }

我应该如何从一个事件中调用UI线程,在一个工作线程上引发?

您可以使用prism事件聚合器来确保您在UI线程上。详见:http://neverindoubtnet.blogspot.com/2009/05/event-aggregator-in-prism-explorer.html

最新更新