代码之家  ›  专栏  ›  技术社区  ›  mike

WPF绑定到并发集合是否安全?

  •  0
  • mike  · 技术社区  · 7 年前

    我想知道,将WPF控件绑定到并发集合是否安全,特别是在 System.Collections.Concurrent 也实现的集合 INotifyCollectionChanged ?

    我明白 CollectionChanged 必须在UI线程上调用(不带索引参数)。但是,如果另一个线程在UI更新自身时操作源集合,会发生什么情况?WPF是否只是优雅地忽略了这个问题(就像在其他许多地方一样)?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Fruchtzwerg    7 年前

    这取决于包装器的实现。让我们做一个简单的例子,添加 INotifyCollectionChanged 到A BlockingCollection<T> 允许调用非UI线程:

    public void AddNotified(T item)
    {
        base.Add(item);
    
        var args = new NotifyCollectionChangedEventArgs(
            NotifyCollectionChangedAction.Add,
            item,
            Count - 1);
    
        //Ensure no items are changed until the UI is updated
    
        Application.Current.Dispatcher.Invoke(() =>
            CollectionChanged?.Invoke(this, args));
    }
    

    实施 Add 它本身是线程安全的,但为了确保UI显示当前项,您需要确保在添加和更新之间没有其他项发生更改(请参见代码中的注释)。

    WPF根据 NotifyCollectionChangedAction 以及在提出 INotifyCollectionChanged.CollectionChanged . 这意味着用户界面依赖于此信息。结果:临时集合更新导致用户界面不同步,直到引发更新或 NotifyCollectionChangedAction.Reset 调用了,并且UI显示不同的项,如源集合中的项。

    将集合与UI同步是一个非常广泛且有趣的主题。已经有多个解决方案可以与您的特定问题相匹配。为了给您提供一些可能的解决问题的方法,请查看以下链接: