2016-08-09 92 views
1

Hallo allerseits ich benutze einen WCF Soap Webservice und konsumieren es in einem Xamarin.Forms MVVM Client. (Mvvm ​​Licht mit MvvmLightNavigationExtension.Xamarin Forms Navigation hängt auf WebService SomeMethodAsyncCompleted Ereignis

Das Problem ist, wenn ich die Async Methoden aus dem Webservice nutzen und entsprechende abgeschlossenes Ereignis in meinem Viewmodel des Navigation stuck/der Bildschirm nicht ändert.

Wenn ich die aktuelle Navigation Seite debuggen .., sagt meine zweite Seite aber die erste Seite ist nach wie vor zeigt sein ich versuchte es auch mit Messengers aber das wird nicht funktionieren eather

ist Down Below einige Beispiel-Code

Fun Tatsache:. Wenn ich eine zweite Taste/Befehl und navigiere zu meiner Sekunde Seite nach ich rief den GetLoginResponseCommand ich kann zurück navigieren zwei mal auf die erste Seite.

Es ist wahrscheinlich eine seltsame Threading/UI Thread Sache, aber ich verstehe es nicht.

public LoginViewModel(INavigationService navigationService, MyWebService service) 
{ 
    _navigationService = navigationService; 
    _myWebService = service; 

    _myWebService.GetLoginInfoCompleted += MyWebServiceOnGetLoginInfoCompleted; 
} 

public RelayCommand GetLoginResponseCommand 
{ 
    get 
    { 
     return _getLoginResponseCommand ?? (_getLoginResponseCommand = new RelayCommand(
      () => 
      { 
       _orkaWebService.GetLoginInfoAsync(request); 
      })); 
    } 
} 

private void MyWebServiceOnGetLoginInfoCompleted(object sender, GetLoginInfoCompletedEventArgs e) 
{ 
    _navigationService.NavigateTo(VmKeys.ArtikelBestandKey); 
} 
+0

Was ist in Ihrem '_navigationService.NavigateTo ist()' –

+0

Sein GalaSoft.MvvmLight.Views.INavigationService –

Antwort

0

Try async/await in Ihrem async Methoden zu verwenden.

return _getLoginResponseCommand ?? (_getLoginResponseCommand = new RelayCommand(
     async() => 
     { 
      await _orkaWebService.GetLoginInfoAsync(request); 
     })); 
+0

Es sagt nicht 'Leere' erwarten kann. Ich habe die Web Reference per Rechtsklick hinzugefügt Service Reference in meinen Projektreferenzen hinzugefügt. –

+0

GetLoginInfoAsync hat den Rückgabetyp 'void'? Der Rückgabetyp sollte eine 'Task' oder' Task ' –

+0

sein Nun kann ich es nicht ändern, weil es automatisch von Visual Studio generiert wird. Es ist ein PCL-Projekt btw. Ich habe es auch auf einem freigegebenen Codebeispiel versucht, aber dort ist auch void type ... Nun fand ich einen anderen Weg herum (was es nicht so verwendet), aber es ist immer noch irgendwie saugt ... –

0

Ich habe es selbst.

Die MyWebServiceOnGetLoginInfoCompleted läuft in einem eigenen Thread. Aber die _navigationService muss auf dem UIThread ausgeführt werden.

(Das Gleiche gilt für ContentPage.DisplayAlert oder ContentPage.DisplayActionSheet)

Wenn Sie führen Sie es wie Device.BeginInvokeOnMainThread(() => _navigationService.NavigateTo(VmKeys.ArtikelBestandKey)); funktioniert es wie ein Charme!

private void MyWebServiceOnGetLoginInfoCompleted(object sender, GetLoginInfoCompletedEventArgs e) 
{ 
    Device.BeginInvokeOnMainThread(() => _navigationService.NavigateTo(VmKeys.ArtikelBestandKey)); 
} 

Danke an Rohit für die richtige Lösung.