【问题标题】:Request UI navigation using PRISM 4 on an asynchronous WCF response thread在异步 WCF 响应线程上使用 PRISM 4 请求 UI 导航
【发布时间】:2011-12-20 16:07:37
【问题描述】:

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

  • 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 没有更新,也没有抛出异常。

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

这是视图的构造函数,它请求它的 View-Model:

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

前面的代码导致 View-Model 的构造函数被调用。我尝试将调度程序存储在 VM 的构造函数调用中,但稍后使用它来调用 UI 导航似乎没有帮助。我认为 View-Model 不是在 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 线程?

【问题讨论】:

    标签: c# wpf multithreading wcf prism


    【解决方案1】:

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

    【讨论】:

    • 谢谢克里斯,非常感谢,我一定会看看的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多