При обновлении набора бизнес-объектов на фоновом потоке я получаю это сообщение об ошибке:
Этот тип CollectionView не поддерживает изменения в своем SourceCollection от потока, отличающегося от потока Диспетчера.
Хорошо, это имеет смысл. Но это также вызывает вопрос, какая версия CollectionView действительно поддерживает несколько потоков и как я заставляю свои объекты использовать его?
Это Post by Bea Stollnitz объясняет , что сообщение об ошибке и почему это адрес, оно есть.
Редактировать: Из блога BEA
К сожалению, этот код приводит к исключию: «NotSupportedException - этот тип CollectionView не поддерживает изменения в его SourceCollection из потока, отличающейся от нити диспетчера». Я понимаю, что это сообщение об ошибке приводит к тому, что люди подумывают, что если коллекция их использует, не поддерживает перекрестные изменения, тогда они должны найти тот, который делает. Ну, это сообщение об ошибке немного вводит в заблуждение: ни одна из коллекторов мы не предоставляем из коробки, поддерживает перекрестные изменения в сборе. И нет, к сожалению, мы не можем исправить сообщение об ошибке в этот момент, мы очень заблокированы.
Ни один из них, просто используйте диспетчер. Начните с
.Найдено.
public class MTObservableCollection<T> : ObservableCollection<T>
{
public override event NotifyCollectionChangedEventHandler CollectionChanged;
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
var eh = CollectionChanged;
if (eh != null)
{
Dispatcher dispatcher = (from NotifyCollectionChangedEventHandler nh in eh.GetInvocationList()
let dpo = nh.Target as DispatcherObject
where dpo != null
select dpo.Dispatcher).FirstOrDefault();
if (dispatcher != null && dispatcher.CheckAccess() == false)
{
dispatcher.Invoke(DispatcherPriority.DataBind, (Action)(() => OnCollectionChanged(e)));
}
else
{
foreach (NotifyCollectionChangedEventHandler nh in eh.GetInvocationList())
nh.Invoke(this, e);
}
}
}
}
http://www.julmar.com/blog/mark/2009/04/01/AddingToAnObservableCollectionFromABackgroundThread.aspx