1

现在我想我明白为什么会发生这种情况了,所以我想我的问题是如何修改代码以按照我的意愿行事。

首先是代码。

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 没有使用异步,并且效果很好。这是否需要混合使用异步和事件?

4

2 回答 2

2

您的处理程序缺少的是asyncand await

因为您将Login方法标记为 async 并使其返回任务,所以您已将其设置为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,你应该尝试“从头到尾”使用它们。

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

于 2013-02-05T16:35:49.637 回答
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 
    }
}
于 2013-02-05T16:33:30.360 回答