在CredentialPickerResults调用后跳过代码

时间:2013-04-15 15:06:21

标签: c# windows windows-store-apps

在进行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
}

1 个答案:

答案 0 :(得分:3)

await需要GetCredentials才能返回。使用当前代码,您只需以“即发即忘”的方式异步启动它,然后转到GetData。这就是GetDataGetCredentials完成之前执行的原因。

您应首先更改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();
}

这样你就能够达到预期的行为。