【发布时间】: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