簡體   English   中英

實時連接 - 異步和等待阻止UI

[英]Live Connect - async and await blocking UI

現在我想我明白為什么會發生這種情況所以我想我的問題是如何修改代碼以實現我想要的方式。

首先是代碼。

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沒有使用異步,並且工作得很好。 這需要混合使用異步和事件嗎?

您在處理程序中缺少的是asyncawait

因為您將Login方法標記為異步並使其返回任務,所以您已將其設置為等待 ,這使得可以將事件處理程序重新編寫為:

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在編譯器如何將它們變成“真實”代碼時有點狡猾,所以如果你需要閱讀更多關於主題的內容以便完全理解它們,不要感到驚訝。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM