MvvmLight,Messenger和Async方法调用

时间:2014-01-24 18:52:24

标签: c# wpf mvvm task-parallel-library mvvm-light

我正在使用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);
}

1 个答案:

答案 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