在哪里Sessions
是 Dictionary<Guid, WebSession>
, 和 NewSession
是new WebSession()
我有这一行:
Sessions.Add(NewSession.SessionID, NewSession);
此时您可能正在转动眼球并思考“要么 Sessions 为空,要么 NewSession.SessionID 为空”。然而:
Sessions == null
false
NewSession.SessionID == null
false
NewSession == null
false
这是断断续续的。可能每 50 次发生一次。无论何时发生,我都可以做 Sessions.Add(NewSession.SessionID, NewSession);
在即时窗口中,它工作正常。
WebSession
的构造函数是同步的,Sessions
是一个没有添加糖分的 Vanilla 字典。
我很确定我已经在这一点上进行了尽职调查。它在我的应用程序中发生是一件无害的事情,它被捕获并干净利落地处理 - 但我对首先导致它的原因感到困惑。
编辑:我想知道是不是因为我的 WebSession
继承: Dictionary<String, Object>
但它的构造函数不调用 base()
- 这仍然无法解释它,因为我可以在执行 Add(..)
之前检查对象是否为空
最佳答案
你需要使用线程安全的集合,比如ConcurrentDictionary ,或实现您自己的同步。
正在尝试访问 Dictionary<TKey,TValue>
来自多个线程可能会导致 heisenbugs,这很可能表现为 NullReferenceException
.
关于c# - NullReferenceException 添加到字典中 - 非常确定没有什么是空的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15189617/