2013-04-15 2 views
1

CredentialPickerResults 호출이 수행 된 후 코드를 건너 뜁니다. 로그인 화면이 표시되지 않고 코드가 현재 기능의 코드를 완료하지 않고 다음 기능으로 이동합니다.CredentialPickerResults 호출 후 코드 건너 뛰기

Global.strUsername = credResults.CredentialUserName 및 암호를 완전히 건너 뛰고 곧바로 GetData() 함수로 이동합니다.

public MainPage() 
{ 
     this.InitializeComponent(); 
     GetCredentials(); 
     GetData(); 
} 

private async void GetCredentials() 
{ 
    CredentialPickerOptions credOptions = new CredentialPickerOptions() 
    { 
     AuthenticationProtocol = AuthenticationProtocol.Basic, 
     CredentialSaveOption = CredentialSaveOption.Selected, 
     CallerSavesCredential = true, 
     Caption = "Login", 
     Message = "Please enter your credentials", 
     TargetName = ".", 
    }; 

    CredentialPickerResults credResults = await CredentialPicker.PickAsync(credOptions); 

    Global.strUsername = credResults.CredentialUserName; 
    Global.strPassword = credResults.CredentialPassword; 
} 

private async void GetData() 
{ 
    //get data 
} 
+2

그걸 건너 뛰지 않으면 단순히 비동기 작업이 결과를 반환하기를 기다리지 않을뿐입니다. 이 문제를 해결하려면 credResults가 null이라는 조건을 반복하면됩니다. –

+0

결과를 기다리는 데 어떻게 걸릴까요? 루프에 넣지 않고 계속해서 같은 전화를 반복해서 호출하지 않겠습니까? – user130622

+0

루프의 중단 조건이 객체가 'null'이 아닌 경우 루프가 한 번만 발생합니다. –

답변

3

당신은 돌아 GetCredentials에 대한 await해야합니다. 현재 코드를 사용하면 비동기로 "화재 및 잊어"방식으로 시작하고 GetData으로 이동할 수 있습니다. 그렇기 때문에 GetCredentials이 완료되기 전에 GetData이 실행됩니다.

먼저 GetCredentialsGetData의 서명을 모두 Task으로 돌려 보내야합니다. 생성자에서 비동기 호출을 기다리고 수 없기 때문에

private async Task GetCredentials() 
{ 
    // get credentials 
} 

private async void GetData() 
{ 
    // get data 
} 

당신이 해결할 수있는 당신이에 전화 "화재와 잊지"모드하지만, 그 안에 다른 호출을 기다리고 있습니다 도우미 기능 :

public MainPage() 
{ 
    this.InitializeComponent(); 
    Init(); 
} 

public async void Init() 
{ 
    await GetCredentials(); 
    await GetData(); 
} 

이렇게하면 원하는 동작을 얻을 수 있습니다.

+0

고마워, 정확히 내가 필요로했던. – user130622