2013-03-03 38 views
6

đâu Sessions là một Dictionary<Guid, WebSession>, và NewSessionnew WebSession() Tôi có dòng này:NullReferenceException thêm vào một từ điển - rất chắc chắn rằng không có gì là null

Sessions.Add(NewSession.SessionID, NewSession); 

Bây giờ vào thời điểm này có lẽ bạn đang lăn nhãn cầu và suy nghĩ của bạn "một trong hai phiên là null, hoặc NewSession.SessionID là null." Tuy nhiên:

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

Nó khá liên tục. Xảy ra có thể một lần trong 50. Và bất cứ khi nào nó xảy ra, tôi chỉ có thể làm Sessions.Add(NewSession.SessionID, NewSession); trong cửa sổ ngay lập tức và nó hoạt động tốt.

Hàm tạo cho WebSession là đồng bộ và Sessions là từ điển vanilla không thêm đường.

Tôi chắc chắn tôi đã thực hiện thẩm định tại thời điểm này. Đó là một điều vô hại đủ để xảy ra trong ứng dụng của tôi và nó bị mắc kẹt và được xử lý một cách sạch sẽ - nhưng tôi bị bối rối như những gì gây ra nó ở nơi đầu tiên.

Edit: Tôi tự hỏi nếu đó là vì tôi WebSession thừa hưởng : Dictionary<String, Object> nhưng constructor của nó không gọi base() - mà vẫn không giải thích nó mặc dù kể từ khi tôi có thể kiểm tra các đối tượng không phải là null trước khi làm Add(..)

+0

có thể trùng lặp của [Ngoại lệ NullReferenceException trong .NET là gì?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net) –

+0

điều gì về việc hiển thị ngăn xếp dấu vết? thông thường điều này sẽ tiết lộ mọi thứ ... –

+0

Thêm một số lời khẳng định với các tin nhắn để thông báo cho bạn biết chính xác những gì là null. – usr

Trả lời

7

Bạn cần sử dụng bộ sưu tập an toàn theo chủ đề như ConcurrentDictionary hoặc triển khai đồng bộ hóa của riêng bạn.

Cố gắng truy cập Dictionary<TKey,TValue> từ nhiều chủ đề có thể dẫn đến heisenbugs, điều này cũng có thể biểu hiện dưới dạng NullReferenceException.

+0

+1 cho heisenbugs, tôi sẽ phải nhớ điều đó :) – BradleyDotNET

Các vấn đề liên quan