У меня есть следующее:
public ICollectionView Children
{
get
{
// Determining if the object has children may be time-consuming because of network timeouts.
// Put that in a separate thread and only show the expander (+ sign) if and when children were found
ThreadPool.QueueUserWorkItem(delegate
{
if (_objectBase.HasChildren)
{
// We cannot add to a bound variable in a non-UI thread. Queue the add operation up in the UI dispatcher.
// Only add if count is (still!) zero.
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
if (_children.Count == 0)
{
_children.Add(DummyChild);
HasDummyChild = true;
}
}),
System.Windows.Threading.DispatcherPriority.DataBind);
}
});
return _childrenView;
}
}
Отлично работает: HasChildren запускается в фоновом потоке, который использует диспетчер для вставки своего результата в переменную, используемую для привязки к пользовательскому интерфейсу.
Примечание: для _childrenView установлено следующее:
_childrenView = (ListCollectionView) CollectionViewSource.GetDefaultView(_children);
Проблема:
Если я вызываю свойство Children из другого потока ThreadPool, я получаю NotSupportedExceptionстрока
_children.Add(DummyChild);
Текст исключения: «Этот тип CollectionView не поддерживает изменения в его SourceCollection из потока, отличного от потока Dispatcher.»
Почему? Я убедился, что этот код выполняется из потока Dispatcher.