2013-03-03 23 views
6

SessionsDictionary<Guid, WebSession>,並NewSessionnew WebSession()我有這樣一行:的NullReferenceException添加到字典 - 非常肯定的是,沒有什麼是空

Sessions.Add(NewSession.SessionID, NewSession); 

現在,在這一點上,你可能滾動你的眼球和思維「或者會話爲空,或者NewSession.SessionID爲空。」然而:

Sessions == null 
false 
NewSession.SessionID == null 
false 
NewSession == null 
false 

它是非常間歇的。在50中可能會發生一次。並且,只要發生,我可以在即時窗口中執行Sessions.Add(NewSession.SessionID, NewSession);並且它工作正常。

WebSession的構造函數是同步的,Sessions是一個沒有加糖的香草字典。

我很確定我已經在這一點上做了盡職調查。在我的應用程序中發生的事情已經沒有任何危害,並且它被困住並處理得很乾淨 - 但我首先想不通的原因。

編輯:我不知道是否是因爲我WebSession繼承: Dictionary<String, Object>但其構造不會調用base() - 這仍然不會是解釋它,因爲我可以檢查的對象不是空做Add(..)

+0

可能的重複[什麼是.NET中的NullReferenceException?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net) – 2013-03-03 19:10:45

+0

顯示堆棧跟蹤怎麼樣?通常這會揭開一切... – 2013-03-03 19:11:35

+0

用消息添加一些斷言,以便該消息告訴你什麼是空。 – usr 2013-03-03 19:11:39

回答

7

您需要使用線程安全的集合,如ConcurrentDictionary,或實現自己的同步。

試圖從多個線程訪問Dictionary<TKey,TValue>可能會導致heisenbugs,這可能表現爲NullReferenceException

+0

爲heisenbugs +1,我將不得不記得一個:) – BradleyDotNET 2014-10-22 21:25:37

相關問題