編輯11-20-2009:這個問題很早以前就發佈了,但問題今天早上又一次上升;所以我希望別人能夠提供一些見解(儘管提供的答案已經有幫助)。是否有可能從ListBox.Items屬性獲得空引用錯誤?
在我們的生產環境中,一旦進入藍色月亮,我們會通過引用ListBox
控件的Items
屬性獲得NullReferenceException
。我已經在下面包含了一些示例代碼。
有問題的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
- 和你曾經能夠弄清楚爲什麼/如何解決問題?
在哪裏你插入發生? – 2009-09-21 20:30:50
還有什麼可以訪問Me.lbxMessages.Items? – 2009-09-22 21:58:48
訪問此屬性的代碼中的唯一要點是:'ProcessQueuedMessages()',它在'Windows.Forms.Timer'上每500毫秒關閉一次(所以在GUI線程上);另一種可能發生在調用'Me.lbxMessages.Items.Clear()'的GUI事件上的方法。 – 2009-09-22 22:56:34