c# async属性调用

本文关键字:调用 属性 async | 更新日期: 2023-09-27 18:08:47

我有一个ListBox,我的SelectedValue被设置为一个类DefaultStrediska它有IEditableObject实现。每次用户在这个特定的ListBox (SelectedValue改变)下选择一个新项目时,我所做的是,我首先检查是否有任何改变,如果是;然后我询问用户是否要保存临时更改(否则我将放弃它们并返回到原始值)。

我正在使用Mahapps。用于显示消息(而不是使用传统的System.Windows.MessageBox)并获取结果的Metro异步方法。问题是,这是一个异步方法我必须从我的属性调用。我是这样做的:

    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线程,我既没有得到消息框,也不能做任何其他事情。如果我删除。结果,那么代码首先转到_SelectedStredisko = value,然后才调用GetResult()方法,这是不可接受的。

我在这里做错了什么?

c# async属性调用

有许多避免死锁的方法,我在这里介绍其中的一些方法。我认为在你的情况下,它可能是最好的使用ConfigureAwait(false)时,你显示的消息,但我没有使用该API自己。

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