向可观察集合添加项目导致集合视图出现异常

4

我有一个 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方法时遇到错误:

未处理的异常类型'System.NotSupportedException'发生在PresentationFramework.dll中

附加信息:这种CollectionView不支持从与Dispatcher线程不同的线程对其SourceCollection进行更改。

现在,我正在从Dispatcher线程中向我的ObservableCollection添加项目-这就是检查的目的,所以这似乎是不可能的。但它抱怨的不是我的可观察集合,而是CollectionView。实际上,我的UI正在绑定从Items创建的ICollectionView,如下所示:
filteredItems = CollectionViewSource.GetDefaultView(Items);

所以这里发生了什么?如果我是从UI线程添加的,CollectionView不应该从同一线程更新吗?如果不是,我该如何使其更新。

更糟糕的是,这很长时间以来都运行良好,据我所知我没有更改任何可能影响到它的东西。

1个回答

4
好的-经过一番调查,似乎是 CollectionView 被创建在了另一个线程上,这似乎是问题的根源。尽管为什么之前似乎没有问题仍然令人困惑。

因此,我修复了代码,确保创建 CollectionView 的代码也在 Dispatcher.Thread 上运行。 在这种情况下,错误消息是具有误导性的。问题不是我试图从非UI线程添加,而是我从UI线程添加到了位于另一个线程上的对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接