2013-12-06 1 views
2

У меня есть LinkedList<T> в моем проекте, где я добавляю и удаляю множество элементов (несколько сотен в секунду). Это происходит из нескольких потоков, синхронизированных через блокировки.NullReferenceException в System.Collections.Generic.LinkedList`1.AddLast (значение T)

Теперь иногда (возможно каждые несколько 100000 элементов) Я получаю NullReferenceException «внутри» метод AddLast, поэтому верхняя запись трассировки стека выглядит следующим образом:

в System.Collections.Generic.LinkedList `1.AddLast (значение T)

У кого-то есть идея, почему это может произойти и как я могу избежать этого?

Простой/глуп пытаясь угадать> догоняющего> повтор будет моей лучшей идеей, но вот еще грязный обходным путем ...

ответ

8

Это происходит из нескольких потоков синхронизированных с помощью замков.

Я подозреваю, что вы забыли заблокировать в одном месте, в основном. Возможно ли это, или у вас есть определенный, вы получаете к нему доступ только в одном месте?

Например, я вижу, как вы могли бы получить это исключение, если бы один поток удалял конечный элемент в списке, в то время как другой поток добавлял новый элемент.

Вместо того, чтобы разоблачать «сырые» связанные списки, я предлагаю вам попытаться получить доступ к нему только из одного класса, который может взять на себя ответственность за все блокировки (и которые должны быть очень и очень простыми).

+0

Доступ уже управляется одним классом - я еще раз проверю, если я забуду замок где-нибудь ... – ChrFin

+0

Вы забыли замок. Даже если вы этого не сделали, вы сделали. ;) – fejesjoco

+0

Хорошо, забыл замок на одном месте и теперь проверил несколько миллионов элементов без его повторения, поэтому, я думаю, он исправлен. Спасибо ... – ChrFin

Смежные вопросы