c#异步属性调用

时间:2015-08-19 11:47:45

标签: c# wpf async-await .net-4.5

我有一个ListBox,其中我的SelectedValue设置为 DefaultStrediska 类,其中实现了 IEditableObject 。每当用户在此特定ListBox(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()。结果完全阻止了UI线程,我既没有得到消息框,也没有做任何其他事情。如果我删除 .Result ,则代码首先转到 _SelectedStredisko = value ,然后才调用 GetResult()方法,这是不可接受的。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

有许多方法可以避免死锁,我会通过其中的一些here。我认为在你的情况下,最好在显示消息时使用ConfigureAwait(false),但我自己还没有使用过该API。

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