Как я получал эту ошибку NullReferenceException здесь прямо после конструктора?

Смотрите на страницу справочника для объект хеша мерзавца . Можно использовать его для вычислений хеша мерзавца какого-то конкретного файла. Я думаю , что мерзавец подает больше, чем просто содержание файла в хеш-алгоритм, но я не знаю наверняка, и если он действительно питается в дополнительных данных, я не знаю, каково это.

52
задан Thomas Flinkow 3 June 2018 в 12:21
поделиться

4 ответа

Это почти наверняка проблема многопоточности - см. этот вопрос и принятый ответ на него .

Dictionary <>. Insert () вызовет внутреннее исключение NullReferenceException , если экземпляр словаря изменен из другого потока во время операции вставки.

119
ответ дан 7 November 2019 в 09:06
поделиться

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

Прочитав это, я могу сделать вывод, что, возможно, .NET исчерпал свою память и не смог создать еще один ключ словаря, это может быть не в чем ваша вина. Но да, мы действительно получали подобные ошибки, когда пытались сохранить слишком много информации в переменных сеанса / приложения, что увеличивало объем памяти, занимаемой веб-приложением. Но мы получали такие ошибки, когда наши числа становились очень высокими, например, хранение 10 000 элементов в Словаре или Списке и т.д.

Шаблон хорош, но вы также должны понимать, что мы используем базу данных для хранения информации в реляционном формате, если мы начнем использовать память для хранения подобных вещей, то мы игнорируем мощную базу данных. База данных также может кэшировать значения для вас.

Это может показаться глупым, но у нас сервер Windows перезапускается каждые 24 часа, в полночь, когда нет движения. Это помогло нам избавиться от таких ошибок. Мы регулярно перезапускаем наши серверы в соответствии с графиком исправлений, чтобы очистить весь кеш / журналы.

1
ответ дан 7 November 2019 в 09:06
поделиться

Я не вижу ничего очевидного. Я бы запустил SQL, чтобы проверить базу данных на наличие неверных данных. Проблема может заключаться в необычной ошибке в соответствующей форме ввода. Если код до сих пор запускался тысячи раз без происшествий, я бы обернул некоторую дополнительную обработку исключений / отчетность вокруг рассматриваемого блока кода, чтобы вы могли, по крайней мере, получить StaffId, если / когда это произойдет в следующий раз.

Вы могли бы потратить много времени на что-то вроде этого. Наиболее целесообразным подходом может быть просто позволить ему снова выйти из строя в вышеуказанных / контролируемых условиях ... при условии, что уровень нарушения, который он вызывает, является приемлемым / управляемым / незначительным.

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

1
ответ дан 7 November 2019 в 09:06
поделиться

Как говорили другие, сравнение могло быть причиной проблемы.
Содержит ли какой-либо из критериев для сравнения значение null? в частности, свойства строки?

т.е. если firstname, lastname или emailId имеет значение null и если они используются для сравнения, то при использовании внутри словаря для сравнения может произойти сбой.

РЕДАКТИРОВАТЬ: Как устроены Supervisor, StaffMember и AdminStaff class связанные?
В коде вы приводите оба экземпляра к StaffMember. Я предполагаю, что это может быть проблемой, если классы Supervisor и StaffMember не связаны .

EDIT2: Какова область действия экземпляра словаря? Распространяется ли он на уровне приложения / сеанса? Возможно ли, что несколько потоков могут попытаться читать / писать из него?

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

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