在进行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
}
答案 0 :(得分: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();
}
这样你就能够达到预期的行为。