我正在使用MvvmLight并使用MessengerInstance.Send(...)方法在我的一些ViewModel之间实现了通信。它很棒!
最近,我已经从使用同步方法转向异步方法来检索数据,看起来这打破了消息传递(可能是因为它在不同的线程上执行)。例如:
public ICommand SomeCommand { get { return new RelayCommand(DoSomething); } }
private async void DoSomething(object obj)
{
//Used to be SomeWcfService.DoSomething(); with some logic afterward
await SomeWcfService.DoSomethingAsync().ContinueWith(task => { //Some logic after method completes });
MessengerInstance.Send(SomeDataToSend, MessageIdentifer.DoSomething);
}
答案 0 :(得分:2)
不要使用延续,只需将它放在等待之后:
private async void DoSomething(object obj)
{
//Used to be SomeWcfService.DoSomething(); with some logic afterward
var result = await SomeWcfService.DoSomethingAsync();
// .ContinueWith(task => { //Some logic after method completes });
// use result here!
MessengerInstance.Send(SomeDataToSend, MessageIdentifer.DoSomething);
}
如果DoSomethingAsync
没有返回任何结果,您可以省略结果,并将代码放置到位。
正如您所写的那样,延续将不会在同一个同步上下文中运行。 await
关键字实际上异步等待你的延续,而不是WCF的异步方法。
如果您的“某些逻辑”是异步的,您也可以在该代码中使用await
。