【问题标题】:c# async property callc# 异步属性调用
【发布时间】:2015-08-19 19:57:10
【问题描述】:

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

我在这里做错了什么?

【问题讨论】:

  • 不要使用属性设置器,创建一个异步方法来设置该属性。
  • 你能告诉我怎么做吗?我不太确定该怎么做。
  • 我尝试了上面链接中的一个答案:App.Current.Dispatcher.InvokeAsync(async () =>here is the GetResult() code),但反应过来了就像我删除了 .Result 一样。标记为异步时怎么没有等待?

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


【解决方案1】:

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

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

【讨论】:

  • 结果和之前一模一样;对我没用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
相关资源
最近更新 更多