1

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
}
4

1 に答える 1

3

戻るにawaitは必要があります。GetCredentials現在のコードでは、「ファイア アンド フォーゲット」方式で非同期に開始し、GetData. そのため、完了GetDataする前に実行されGetCredentialsます。

GetCredentials最初に両方の署名を変更して˙GetDataを返し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();
}

このようにして、目的の動作を実現できるはずです。

于 2013-04-15T18:58:26.820 に答える