2013-03-03 7 views
6

Dove Sessions è un Dictionary<Guid, WebSession>, e NewSession è new WebSession() ho questa linea:NullReferenceException aggiungendo un dizionario - molto certo che nulla è nullo

Sessions.Add(NewSession.SessionID, NewSession); 

Ora, a questo punto probabilmente stai a rotazione i tuoi occhi e il pensiero "bene o Sessioni è nullo o NewSession.SessionID è nullo." Tuttavia:

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

È piuttosto intermittente. Succede forse una volta su 50. E ogni volta che succede, posso semplicemente fare Sessions.Add(NewSession.SessionID, NewSession); nella finestra immediata e funziona bene.

Il costruttore per WebSession è sincrono e Sessions è un dizionario vaniglia senza zuccheri aggiunti.

Sono abbastanza sicuro che ho fatto due diligence a questo punto. È una cosa abbastanza innocua da accadere nella mia applicazione ed è intrappolata e gestita in modo pulito - ma sono perplesso su ciò che lo causa in primo luogo.

Edit: mi chiedo se è perché la mia eredita WebSession: Dictionary<String, Object> ma il suo costruttore non chiama base() - che ancora non spiegherebbe, però da quando posso verificare che l'oggetto non è nullo prima di fare Add(..)

+0

possibile duplicato di [Che cos'è una NullReferenceException in .NET?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net) –

+0

cosa dire di una traccia dello stack? di solito questo svela tutto ... –

+0

Aggiungi alcuni avvisi con i messaggi in modo che il messaggio ti dica esattamente che cosa è stato nullo. – usr

risposta

7

È necessario utilizzare una raccolta thread-safe come ConcurrentDictionary o implementare la propria sincronizzazione.

Il tentativo di accedere a un Dictionary<TKey,TValue> da più thread può causare heisenbugs, che potrebbero manifestarsi come NullReferenceException.

+0

+1 per heisenbugs, dovrò ricordare quello :) – BradleyDotNET

Problemi correlati