gpt4 book ai didi

c# - MvvmLight,Messenger和Async方法调用

转载 作者:行者123 更新时间:2023-12-03 10:28:35 25 4
gpt4 key购买 nike

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

最佳答案

不用继续,只需将它放在等待之后:

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的async方法。

如果“某些逻辑”是异步的,则也可以在该代码中使用 await

关于c# - MvvmLight,Messenger和Async方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21340226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com