所以我有一个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
是否应该从同一个线程更新?如果没有,我该如何做到这一点。
更糟糕的是,这项工作很长时间以来都没有改变,据我所知,我没有改变任何可能影响到这一点的事情。
答案 0 :(得分:2)
好的 - 稍微调查一下,似乎CollectionView
是在不同的线程上创建的,而这似乎是问题的根源。虽然之前为什么它似乎没有问题仍然令人费解。
所以我修复了它以确保创建CollectionView
的代码也在Dispatcher.Thread
上运行。在这种情况下,错误消息具有误导性。问题不是我试图从非UI线程添加,问题是我是从UI线程添加,而是生活在不同线程上的东西。