将项添加到可观察集合,导致集合视图异常

时间:2016-12-29 18:53:53

标签: c# wpf multithreading

所以我有一个ObservableCollection<Foo>,我就像这样添加一个项目:

Items.AddFromThread(svm);

AddFromThread是一种扩展方法,如下所示:

public static void AddFromThread<T>(this ICollection<T> s, T obj)
{
    if (System.Windows.Application.Current.Dispatcher.Thread != System.Threading.Thread.CurrentThread)
    {
        System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() => s.AddFromThread(obj)), null);
    }
    else
    {
        s.Add(obj);
    }
}

这工作正常,但就在最近我开始使用Add方法出错:

  

PresentationFramework.dll中出现未处理的“System.NotSupportedException”类型异常

     

其他信息:此类型的CollectionView不支持从与Dispatcher线程不同的线程更改其SourceCollection。

现在我将我的项目从调度程序线程添加到我的ObservableCollection - 这就是检查的内容,所以这看起来应该是不可能的。但它不是抱怨我的可观察集合,而是抱怨CollectionView。我的用户界面实际上是绑定了ICollectionView Items,就像这样:

filteredItems = CollectionViewSource.GetDefaultView(Items);

那么这里发生了什么?如果我从UI线程添加,那么CollectionView是否应该从同一个线程更新?如果没有,我该如何做到这一点。

更糟糕的是,这项工作很长时间以来都没有改变,据我所知,我没有改变任何可能影响到这一点的事情。

1 个答案:

答案 0 :(得分:2)

好的 - 稍微调查一下,似乎CollectionView是在不同的线程上创建的,而这似乎是问题的根源。虽然之前为什么它似乎没有问题仍然令人费解。

所以我修复了它以确保创建CollectionView的代码也在Dispatcher.Thread上运行。在这种情况下,错误消息具有误导性。问题不是我试图从非UI线程添加,问题是我是从UI线程添加,而是生活在不同线程上的东西。