簡體   English   中英

C#異步屬性調用

[英]c# async property call

我有一個列表框,其中我的SelectedValue設置為已實現IEditableObject的類DefaultStrediska 每當用戶在此特定的列表框下選擇一個新項目(SelectedValue發生更改)時,我首先要檢查是否進行了任何更改,如果是,請執行什么操作; 然后詢問用戶是否要保存臨時更改(否則我將其丟棄並返回到原始值)。

我正在使用Mahapps.Metro異步方法來顯示消息(而不是使用傳統的System.Windows.MessageBox)並獲取結果。 問題是,這是我必須從屬性中調用的異步方法。 這是我的方法:

    private async Task<bool> GetResult()
    {
        if (await Window.ShowMessageAsync("Zmena v údajoch", "Pozor! Nastala zmena v údajoch. Prajete si ich dočasne uložiť zmeny?", MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative)
            _SelectedStredisko.EndEdit();

    return true;
    }

    private DefaultStrediska _SelectedStredisko;
    public DefaultStrediska SelectedStredisko
    {
        get { return _SelectedStredisko; }
        set
        {
            //check if any changes have been made
            if (value != null && _SelectedStredisko != null)
            {
                if (_SelectedStredisko.WasChangeMade())
                {
                    var x = GetResult().Result;
                }
            }

            _SelectedStredisko = value;

            //create backup of current data
            _SelectedStredisko.BeginEdit();

            OnPropertyChanged("SelectedStredisko");
        }
    }

但是問題是,現在我的var x = GetResult()。Result完全阻塞了UI線程,並且我既未獲取消息框,也無法執行任何其他操作。 如果刪除.Result ,則代碼首先轉到_SelectedStredisko = value,然后才調用GetResult()方法,這是不可接受的。

我在這里做錯了什么?

有很多避免僵局的方法,在這里我將介紹其中的幾種方法。 我認為在您的情況下,顯示消息時最好使用ConfigureAwait(false) ,但我自己並未使用該API。

await Window.ShowMessageAsync(..).ConfigureAwait(false)

暫無
暫無

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

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