6

はどこSessionsにあり、Dictionary<Guid, WebSession>NewSessionnew WebSession()この行を持っていますか?

Sessions.Add(NewSession.SessionID, NewSession);

この時点で、おそらく目を転がして、「Sessionsがnullであるか、NewSession.SessionIDがnullである」と考えているでしょう。でも:

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

かなり断続的です。おそらく50年に1回発生します。それが発生したときはいつでもSessions.Add(NewSession.SessionID, NewSession);、すぐにウィンドウで実行でき、正常に動作します。

のコンストラクターWebSessionは同期型であり、Sessions砂糖が追加されていないバニラ辞書です。

この時点で、デューデリジェンスを行ったと確信しています。それは私のアプリケーションで発生するのに十分無害であり、トラップされてきれいに処理されます-しかし、そもそも何が原因であるかについて私は困惑しています。

WebSession編集:継承するの: Dictionary<String, Object>にコンストラクターが呼び出さないためかどうか疑問に思ってbase()いますが、オブジェクトがnullでないことを確認してから実行することができるので、それでも説明できません。Add(..)

4

1 に答える 1

7

ConcurrentDictionaryなどのスレッドセーフなコレクションを使用するか、独自の同期を実装する必要があります。

複数のスレッドからにアクセスしようとするとDictionary<TKey,TValue>、heisenbugsが発生する可能性があり、これはとして現れる可能性がありますNullReferenceException

于 2013-03-03T19:25:39.080 に答える