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

您需要返回awaitGetCredentials使用您当前的代码,您只需以“即发即弃”的方式异步启动它,然后转到GetData. 这就是为什么在完成GetData之前执行GetCredentials

您应该首先更改两者的签名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();
}

这样,您应该能够实现所需的行为。

于 2013-04-15T18:58:26.820 回答