РЕДАКТИРОВАТЬ 11-20-2009 : Этот вопрос был опубликован довольно давно, но проблема снова возникла сегодня утром; поэтому я надеюсь, что кто-то еще может дать некоторое представление (хотя предоставленные ответы уже были полезны).
Оказавшись в голубой луне в нашей производственной среде, мы получаем NullReferenceException
от ссылки на свойство Items
элемента управления ListBox
. Ниже приведен пример кода.
Родительская форма рассматриваемого ListBox
содержит приватный Queue<string>
с именем QueuedMessages
. Эта очередь получает новые сообщения о событиях. Для таймера, который срабатывает каждые 500 мс, выполняется следующий метод:
void DisplayQueuedMessages() {
lock (QueuedMessages) {
while (QueuedMessages.Count > 0) {
string msg = QueuedMessages.Dequeue();
this.lbxMessages.Items.Insert(0, msg); // NullReferenceException
if (this.lbxMessages.Items.Count > MAX_LBX_ITEMS) {
this.lbxMessages.Items.RemoveAt(Me.lbxMessages.Items.Length - 1);
}
}
}
}
Опять же, как я уже говорил, это только бросает NullReferenceException
очень редко. За несколько месяцев использования приложения это произошло три или четыре раза.
Кроме того, несколько раз, когда это происходило, кажется, что либо свойство ListBox.Items
, либо просто сам ListBox
загадочным образом исчезают навсегда: все последующие методы, добавляющие элементы в ListBox
, генерируют исключения. Единственный способ восстановления - закрыть приложение и восстановить его.
К сожалению, постоянно отвлекаясь на миллион других дел, я так и не удосужился добавить журналы до вставок. Я добавил запись сейчас, но может пройти месяц или больше, прежде чем мы снова увидим эту проблему. А пока есть еще идеи? Каковы некоторые возможные объяснения этому?
Я предполагаю, что мой настоящий вопрос: Кто-нибудь еще когда-либо видел, чтобы это произошло - доступ к ListBox
, который существовал , существовал и внезапно получил NullReferenceException
- и вы когда-нибудь могли выяснить почему / как решить проблему?