实时连接 - 异步和等待阻止UI

时间:2013-02-05 16:24:52

标签: c# windows-phone-8 async-await live-connect-sdk

现在我想我理解为什么会发生这种情况所以我想我的问题是如何修改代码以实现我的想法。

首先是代码。

private void btnLiveSignin_Click(object sender, RoutedEventArgs e)
{
    var LoggedIn = Login();

    busy.Visibility = System.Windows.Visibility.Visible;  // Display the please wait message

    if (LoggedIn.Result)
    {
        // Do something 
    }
}

public async Task<bool> Login()
{
    try
    {
        var e = await lac.InitializeAsync(Scopes);

        if (e.Status == LiveConnectSessionStatus.Connected)
        {
            client = new LiveConnectClient(e.Session);

            // do some stuff now that we are connected

            return true;
        }
        else
        {
            // not connected so do something

            return false;
        }
    }
    catch (Exception ex)
    {
        return false;
    }
}

基本上,当用户点击一个按钮时,它会将它们登录到他们的Windows真实账户,当发生这种情况时会出现一条消息,要求用户请等待。

您可以猜到UI锁定,因此消息永远不会出现。如何更改它以便UI不锁定?

我在使用事件之前使用Windows Phone 7.5完成了这个操作,因为sdk没有使用异步,并且工作得很好。这需要混合使用asyncing和事件吗?

2 个答案:

答案 0 :(得分:2)

您在处理程序中遗漏的内容是asyncawait

因为您将Login方法标记为异步并使其返回任务,所以您已将其设为 awaitable ,这样就可以将事件处理程序重新编写为:

private async void btnLiveSignin_Click(object sender, RoutedEventArgs e)
{
    var loginTask = this.Login();

    busy.Visibility = System.Windows.Visibility.Visible; 

    await loginTask;

    if(loginTask.Result)
    {
       // Do something 
    }
}

将事件处理程序标记为async向调用者指示它将异步完成。 await所做的是“发出信号”,您希望在继续之前等待任务完成。这意味着事件处理程序可以将“不完整”结果返回给调度程序(UI线程),调度程序将在后台运行而不会中断UI。

通常,在代码中开始使用asyncawait后,您应该尝试“一直使用”。

asyncawait在编译器如何将它们转换为“真实”代码方面有点狡猾,所以如果您需要阅读更多关于主题的内容以完全理解它们,请不要感到惊讶。

答案 1 :(得分:1)

你需要await任务而不是阻塞等待(希望Result这样做)。

private async void btnLiveSignin_Click(object sender, RoutedEventArgs e)
{
    busy.Visibility = System.Windows.Visibility.Visible;  // Display the please wait message

    if(await Login())
    {
       // Do something 
    }
}