2017-09-28 1 views
0

Ich habe versucht, wie mein mvvm Modell zu verwenden mvvmlight aber ich einige Fehler es nicht verstehen. Es sagte, ich kann void cant verwenden nicht erwarten. Wenn Leere Verwendung kann nicht erwarten dann, was soll ich tun, hier in meinem Code ist:Kann nicht in MVVM Licht Xamarin Void Await Forms

async void OnLoginButtonClicked(object sender) 
{ 
    try 
    { 
     var result = await App.AuthenticationClient.AcquireTokenAsync(
      Constants.Scopes, 
      string.Empty, 
      UiOptions.SelectAccount, 
      string.Empty, 
      null, 
      Constants.Authority, 
      Constants.SignUpSignInPolicy); 
     await _navigationservice.NavigateTo(Locator.MainPageViewModel); 
    } 
    catch (MsalException ex) 
    { 
     if (ex.Message != null && ex.Message.Contains("AADB2C90118")) 
     { 
      await OnForgotPassword(); 
     } 
     if (ex.ErrorCode != "authentication_canceled") 
     { 
      // await DisplayAlert("An error has occurred", "Exception message: " + ex.Message, "Dismiss"); 
     } 
    } 
} 

und der Fehler in der await _navigationservice.NavigateTo(Locator.MainPageViewModel); es zeigt Fehlermeldung richtig diese Cannot await 'void' was soll ich hier tun?

+5

Änderung 'void' zu' Task' –

+1

gute Praktiken für async/await: https://msdn.microsoft.com/en-us/magazine/jj991977.aspx – OrcusZ

+2

entfernen 'await' von' _navigationservice. NavigateTo-Zeile. Diese Methode ist ungültig und kann daher nicht erwartet werden. – Nkosi

Antwort

0

Put Leere Rückkehr Methode innerhalb Task.Run() und warten auf sie. Hier finden Sie eine bessere Erklärung. Do you have to put Task.Run in a method to make it async?

Sie können wie folgt implementieren.

async void OnLoginButtonClicked(object sender) 
{ 
    try 
    { 
     ....//previous code 
     await Task.Run(() => 
      { 
      _navigationservice.NavigateTo(Locator.MainPageViewModel); 
      }); 
    } 
    catch (MsalException ex) 
    { 

     // 
    } 
} 
+0

Denken Sie daran, dass jeder Code innerhalb der 'Aktion', die an' Task.Run' übergeben wird, auf dem 'ThreadPool' läuft. Dies hat Auswirkungen, wenn der Code auf die Benutzeroberfläche zugreifen muss. –

Verwandte Themen