Где я получаю ориентированный на многопотоковое исполнение CollectionView?

При обновлении набора бизнес-объектов на фоновом потоке я получаю это сообщение об ошибке:

Этот тип CollectionView не поддерживает изменения в своем SourceCollection от потока, отличающегося от потока Диспетчера.

Хорошо, это имеет смысл. Но это также вызывает вопрос, какая версия CollectionView действительно поддерживает несколько потоков и как я заставляю свои объекты использовать его?

68
задан abatishchev 20 March 2012 в 08:37
поделиться

3 ответа

Это Post by Bea Stollnitz объясняет , что сообщение об ошибке и почему это адрес, оно есть.

Редактировать: Из блога BEA

К сожалению, этот код приводит к исключию: «NotSupportedException - этот тип CollectionView не поддерживает изменения в его SourceCollection из потока, отличающейся от нити диспетчера». Я понимаю, что это сообщение об ошибке приводит к тому, что люди подумывают, что если коллекция их использует, не поддерживает перекрестные изменения, тогда они должны найти тот, который делает. Ну, это сообщение об ошибке немного вводит в заблуждение: ни одна из коллекторов мы не предоставляем из коробки, поддерживает перекрестные изменения в сборе. И нет, к сожалению, мы не можем исправить сообщение об ошибке в этот момент, мы очень заблокированы.

17
ответ дан 24 November 2019 в 14:06
поделиться

Ни один из них, просто используйте диспетчер. Начните с

.
0
ответ дан 24 November 2019 в 14:06
поделиться

Найдено.

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

7
ответ дан 24 November 2019 в 14:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: