编辑 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
抛出异常的后续方法。恢复的唯一方法是关闭应用程序并将其重新启动。
不幸的是,我经常被一百万件其他事情分心,我从来没有在插入之前添加日志记录。我现在已经添加了日志记录,但我们可能需要一个月或更长时间才能再次看到这个问题。与此同时,还有什么想法吗?对此有哪些可能的解释?
我想我真正的问题是:有没有其他人见过这种情况 - 访问确实存在的 aListBox
并突然得到 a NullReferenceException
- 你是否能够弄清楚为什么/如何解决问题?