【问题标题】:Code being skipped after CredentialPickerResults callCredentialPickerResults 调用后跳过的代码
【发布时间】:2013-04-15 15:06:20
【问题描述】:

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

【问题讨论】:

  • 它没有跳过它,您只是没有等待异步操作返回结果。您可以通过在 credResults 为 null 的条件下循环来解决此问题。
  • 我将如何等待结果?不会把它放到一个循环中,只是一遍又一遍地调用同一个调用吗?
  • 如果循环的中断条件是对象不是null,那么循环只发生一次。

标签: c# windows windows-store-apps


【解决方案1】:

您需要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();
}

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

【讨论】:

  • 谢谢,正是我需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 2012-03-29
  • 2014-10-21
相关资源
最近更新 更多