6

Sessionsa在哪里Dictionary<Guid, WebSession>,我有这条线NewSessionnew 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);在即时窗口中进行操作,并且效果很好。

for 的构造函数WebSession是同步的,Sessions是一个没有添加糖的普通字典。

我很确定我在这一点上已经做了尽职调查。这是在我的应用程序中发生的一件足够无害的事情,并且它被捕获并干净地处理 - 但我对首先导致它的原因感到困惑。

编辑:我想知道是不是因为我的WebSession继承: Dictionary<String, Object>但它的构造函数没有调用base()- 虽然我可以在做之前检查对象不为空,但仍然无法解释它Add(..)

4

1 回答 1

7

您需要使用线程安全的集合,例如ConcurrentDictionary,或者实现自己的同步。

尝试Dictionary<TKey,TValue>从多个线程访问 a 可能会导致 heisenbugs,这很可能表现为NullReferenceException.

于 2013-03-03T19:25:39.080 回答