Недостающие элементы коллекции - PullRequest
1 голос
/ 10 апреля 2010

У меня есть коллекция

ObservableCollection<string> outoverList

И у меня есть функция, которая вызывает коллекцию

outoverList.Add("out:"+element.tagName);

Сбор вызовов функций несколько раз, но иногда сбор потерянных элементов. Мы вызываем функцию -> функция добавляет элемент -> коллекция имеет 9 элементов (например) -> в следующей вызывающей функции коллекция имеет только 8 элементов. Отсутствует один элемент.

Here Resharpers Найти журнал использования:

   Search target
  FindElementHandler.outoverList:ObservableCollection<string>
Found 3 usages in solution
  <FindElementExperiments> (3 items)
    FindElementHandler.cs (3 items)
      (50,13) outoverList = new ObservableCollection<string>();
      (94,13) outoverList.Add("out:"+element.tagName);
      (118,13) outoverList.Add("over:" + element.tagName);

Как видите, я просто добавляю элементы в коллекцию везде. Я не могу удалить элементы кода.

Может быть, я сделал что-то не так, вы можете посмотреть на снимок экрана: http://www.youtube.com/watch?v=Ei6dQnHCMIc

Я новичок и часто сталкиваюсь с различными проблемами, но эта ошибка выглядит для меня загадочно.

P / S / Извините за английский

1 Ответ

1 голос
/ 10 апреля 2010

Мне представляются две вероятные возможности:

  1. у вас есть какой-то другой код (возможно, обработчик событий, отвечающий на события наблюдаемой коллекции, или, возможно, другой поток), который явно вызывает удаление. Чтобы проверить это, я добавил бы некоторый отладочный код, который подписывается на наблюдаемую коллекцию и записывает строку трассировки при добавлении элементов, которые должны быть удалены довольно быстро
  2. у вас есть несколько потоков, и происходит ситуация с потоком. Обратите внимание, что эта коллекция не синхронизирована, поэтому, если несколько потоков изменяют ее (добавляют / удаляют / переназначают) одновременно, все ставки отключены и полностью возможно потерять данные, особенно с Add. Чтобы проверить это, я бы использовал тот же обработчик трассировки, что и выше, но я бы включил (в вывод Thread.CurrentThread.ManagedThreadId)
...