2014-01-24 37 views
1

我正在使用MvvmLight並使用MessengerInstance.Send(...)方法在一些ViewModel之間實現了通信。它很棒!最近,儘管我已經從使用同步方法轉移到異步方法來檢索數據,並且它看起來像是破壞了消息傳遞(可能是因爲它在不同的線程上執行)。例如:MvvmLight,Messenger和異步方法調用

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

我在想MessengerInstance.Send()沒有在同一個線程中運行,因爲'DoSomething'(類方法,而不是WCF)在單獨的線程上運行。這讓我覺得這就是爲什麼我的單元測試沒有看到消息彈出。我不知道情況是否如此,但按照您的建議(不使用延續)完美地工作!謝謝! – Killnine

+0

'async void'?這不應該是「異步任務」嗎? –

+0

@PanagiotisKanavos通常,它在大多數命令實現中必須是無效的方法。我有一個和'async Task'一起工作的,但是大多數需要'async void'(*不幸)' –