2014-01-24 2 views
1

MvvmLight를 사용 중이며 MessengerInstance.Send (...) 메서드를 사용하여 일부 ViewModel간에 통신을 구현했습니다. 그것은 위대한 작품!MvvmLight, Messenger 및 Async 메서드 호출

최근에 동기 메서드를 사용하여 데이터를 검색하는 비동기 메서드로 이동했으며 메시징을 중단하는 것처럼 보입니다 (아마도 다른 스레드에서 실행되기 때문일 수 있습니다). 예를 들어 :

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); 
} 

답변

2

대신 지속을 사용하는 바로 await를 뒤에 넣어 :

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을 사용할 수도 있습니다.

+0

DoSomething (클래스 메서드, WCF가 아닌)이 별도의 스레드에서 실행 중이므로 MessengerInstance.Send()가 동일한 스레드에서 실행되고 있지 않다고 생각했습니다. 이것은 내 단위 테스트에서 메시지 팝업이 보이지 않는 이유라고 생각하게 만들었습니다. 나는 그것이 사실인지 모르지만, 당신이 제안한 것을 수행하면 (연속을 사용하지 않음) 완벽하게 작동합니다! 감사! – Killnine

+0

'async void'? 이것은 '비동기 작업'이 아니어야합니까? –

+0

@PanagiotisKanavos 일반적으로 대부분의 명령 구현에서 사용할 수있는 방법은 void 여야합니다. 나는'async Task'와 함께 작동하지만, 대부분은 async void (* 불행히도)'' –

관련 문제