WPF: Не удается получить доступ к связанной ObservableCollection, хотя используется Dispatcher.BeginInvoke - PullRequest
2 голосов
/ 24 декабря 2010

У меня есть следующее:

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.

1 Ответ

6 голосов
/ 28 декабря 2010

Мы столкнулись с этой проблемой перед собой. Вопрос двоякий:

1- Убедитесь, что любые изменения в SourceCollection находятся в главном потоке (вы это сделали).

2- Убедитесь, что создание CollectionView также было в основном потоке (если оно было создано в другом потоке, скажем, в ответ на обработчик событий, это обычно не будет иметь место). CollectionView ожидает, что изменения находятся в «его» потоке, И что «его» поток является потоком «UI».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...