【问题标题】:Async with WPF properties与 WPF 属性异步
【发布时间】:2013-11-02 05:50:58
【问题描述】:

我有一个这样的绑定属性:

public string MyPath
{
    get { return _mypath; }
    set
    {
        _mypath = value;
        NotifyPropertyChanged(() => MyPath);
        LoadSomeStuffFromMyPath(mypath)
    }
}

我希望使 LoadSomeStuffFromMyPath 异步,但我无法等待属性。有没有简单的方法来做到这一点?

编辑:不止一个人说不要使用属性,所以我想把它说出来。我正在使用 WPF,并且此属性绑定到 UI。我必须使用属性。

【问题讨论】:

  • 代码设置一个值在LoadSomeStuffFromMyPath完成之前不继续执行是否重要?如果不是,则触发并忘记,如果是,则不要使用属性,使用方法来设置值。
  • @Servy 是的,重要的是不要继续。不幸的是,我使用的是 WPF,所以我没有不使用属性的选项。
  • @Justin984 如果不能继续,为什么要异步呢?
  • @ReedCopsey 我想显示一个进度条
  • @Servy get 和 set 都绑定到 UI。

标签: c# wpf async-await


【解决方案1】:

也许您应该将这种逻辑转移到方法中。您违反了使用属性的准则:

该操作比字段集慢几个数量级。 如果您甚至考虑提供 异步版本 避免阻塞线程的操作,很可能是 运营成本太高,不能成为财产。特别是,运营 访问网络或文件系统(一次除外) 初始化)很可能是方法,而不是属性。

http://msdn.microsoft.com/en-us/library/vstudio/ms229054(v=vs.100).aspx

编辑: 我对 WPF 不是很有经验,但我认为这可能是一种绑定方法而不是属性的方法:

Binding a method to a column in datagrid WPF

【讨论】:

  • 没有上下文很难说,但鉴于它是 WPF,它很有可能用于数据绑定,这需要它是一个属性。这是confirmed by the op
  • 你是对的。即便如此,我认为还是把它留在这里比较好,因为这是一种很常见的属性滥用,你同意吗?
  • 就个人而言,没有。如果它显然不是适用于该问题的答案,我发现将其作为答案会让人分心。不,您需要有一个属性来进行绑定,您将无法使用方法。
【解决方案2】:

由于您想强制操作在完成之前不继续,我建议您制定一种方法来处理加载和显示您的进度。

您可以在加载时使用一个单独的属性来禁用 UI,这可以有效地“阻止”您的用户,直到操作完成:

public string MyPath
{
    get { return _mypath; }
    set
    {
        _myPath = value;
        NotifyPropertyChanged(() => MyPath);
        UpdateMyPathAsync();
    }
}

public async Task UpdateMyPathAsync()
{
    this.EnableUI = false; // Stop user from setting path again....
    await LoadSomeStuffFromMyPathAsync(MyPath); 
    this.EnableUI = true;
}

这允许您仍然像往常一样与 WPF 绑定,但让您的 UI 反映操作正在运行(异步)并显示进度等。

【讨论】:

  • 由于没有等待 UpdateMyPathAsync(),这不会导致执行继续吗?
  • @Justin984 是的,但是禁用 UI 将阻止 hte 用户执行任何操作 - 如果您想允许 UI 更新,您无法停止执行。 .
  • 好吧,我的意思是 UpdateMyPathAsync() 之后发生的任何事情都会立即执行。我没有提交完整的源代码,但是在 UpdateMyPathAsync 之后我有一些东西我不想在文件加载之前执行。
  • @Justin984 然后将其包装在一个单独的异步方法调用中,这样您就可以控制操作的顺序(这是我禁用/启用 UI 所做的)
  • 请注意,使用此解决方案,UpdateMyPathAsync 引发的异常将被忽略。
猜你喜欢
  • 2018-03-17
  • 2012-11-26
  • 1970-01-01
  • 2019-04-21
  • 2017-11-01
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多