2017-09-28 3 views
0

mvvm 모델을 mvvm 모델로 사용하려고했지만 이해가 안되는 오류가있었습니다. 그것은 내가 캔트 사용을 기다릴 수 없다고 말했다. 바로이 Cannot await 'void' 내가 여기 어떻게해야MVVM 라이트 Xamarin 양식에서 Void를 기다릴 수 없습니다.

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); 가 표시 오류 메시지입니다 : 무효 캔트 사용 후 기다리고 있다면 무엇을 나는 내 코드 여기 여기에해야합니까?

+5

변화는'비동기/await를 위해 Task' –

+1

모범 사례'로 void' : https://msdn.microsoft.com/en-us/magazine/jj991977.aspx – OrcusZ

+2

_navigationservice'에서'await'를 제거합니다. NavigateTo' 행. 이 방법은 무효이므로 기다릴 수 없습니다. – Nkosi

답변

0

void 반환 메서드를 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에 액세스해야 할 때 이것이 영향을 미칩니다. –