2017-09-28 8 views
0

私はmvvmmをmvvmモデルとして使用しようとしましたが、何らかのエラーがあります。それは私が空き缶の使用を待つことができないと言いました。空カントの使用は、私はここに、ここで何をすべきそして待っていた場合、私のコードは次のとおりです。MVVMライトXamarinフォームで無効にすることはできません

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

とエラーがawait _navigationservice.NavigateTo(Locator.MainPageViewModel); であることは、右のこのCannot await 'void'は私がここに何をすべきエラーメッセージを表示?

+5

非同期/のawaitのための 'Task' –

+1

グッドプラクティスに変更し' void':https://msdn.microsoft.com/en-us/magazine/jj991977.aspx – OrcusZ

+2

_navigationservice 'から' await'を削除します。 NavigateTo行。その方法は無効なので、待つことはできません。 – Nkosi

答えて

0

void ReturnメソッドをTask.Run()内に置き、それを待ちます。 ここでは、より良い説明を見つける。 Do you have to put Task.Run in a method to make it async?

このように実装できます。

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

     // 
    } 
} 
+0

'Task.Run'に渡される' Action'内のコードは、 'ThreadPool'で実行されることに注意してください。これは、コードがUIにアクセスする必要があるときに影響を与えます。 –

関連する問題