один пишет в коллекцию другой удаляет с коллекции, при копировании коллекции в которую пишет другой поток выходит исключение, предполагаю что сначала коллекции temp выделяется определенное место и в это время коллекция которую копирую вырастает и потому ошибка выходит, как можно решить данную проблему?
нужно защитить lock любое обращение к коллекции (как в первой строке). В этом куске вначале есть блокировка, в конце нет. Возможно в другом потоке тоже нет. ну и не понятно как объявлен temp
temp перед lock объявлен List<string> temp = new List<string>(); а что значит в конце нет блокировки? я локом закрываю общую коллекцию на 2 потока, записываю данные в temp и потом открываю коллекцию для 2=ух потоков
после строки if(delete) должен следjвать lock как в первой строке
а зачем? если в этот метод только в своем потоке крутится? т.е. никто не удалит из коллекции данные кроме этого потока
так второй же поток пишет в него
один только пишет в допустим коллекцию 1, второй поток создает переменную и копирует в нее данные из коллекции 1, затем этот же поток удаляет с коллекции 1 значение, коллекция уже изменилась, увеличилась, он выходит из метода и снова заходит, снова создает новую коллекцию и копирует из коллекции 1 уже новые значения
Каждое обращение в разных потоках к коллекции 1 должно быть защищено lock, чтоб пока один поток читает/пишет/удаляет в этой коллекции, другой поток ждал своей очереди
а понял в чем причина, в List каждая ячейка содержит ссылку на другую ячейку и если мы с одного потока удаляем, то ссылки пропадают
https://habr.com/ru/post/473352/
я бы код чуть чуть переписал. Типа этого. List<string> collection1 = new List<string>(); List<string> copyCollection = new List<string>(); lock (collection1) { copyCollection.AddRange(collection1.Distinct().ToList()); collection1.RemoveAll(a => CheckDataCrc(a)); }
Обсуждают сегодня