我正在做一个使用以下技术的项目:
- 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