[英]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.