2010-04-10 2 views
1

У меня есть коллекцияНедостающие элементы коллекции

ObservableCollection<string> outoverList 

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

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

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

Здесь 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); 

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

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

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

P/S/ К сожалению для английского

ответ

1

Два вероятных возможностей происходят мне:

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