Dictionary`2.Insertからぬるり

(゚д゚)ってなった事象。

System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。
  場所 System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
  場所 Inscribe.Communication.UserStreams.ConnectionManager.RefreshConnection(AccountInfo info)
  場所 Inscribe.Communication.UserStreams.ConnectionManager.b__2(AccountInfo i)

っていう例外が飛ぶんですね。なんでか知らないけど。

ConnectionManager.RefreshConnectionは単純にDictionaryの内容を弄り回してるだけなので、何が起きてるんだ 「Yフゥォォォォァァァァ—–!!!!!! ってなったところ。

ググってみたら答えがありました。

いつもいつもお世話になっているstackoverflowさん。

http://stackoverflow.com/questions/1320264/how-did-i-get-this-nullreferenceexception-error-here-right-after-the-constructor

Dictionary<>.Insert() will throw a NullReferenceException internally if the dictionary instance is modified from another thread during the insert operation.

要するに、きっちりDictionaryでSynchronizationが行われてないと死ぬよ、ってことですね。

lockなり、ReaderWriterLockSlimなりで同期取ってやるといいです。

.NET Framework 4 なら、System.Collections.Concurrent名前空間にConcurrentDictionaryっていうのもあります。こいつはスレッドセーフなので、あんまり変な事考えないで使うことができそうです。癖があるので、クリティカルなところだと自分でシンクロを実装した方が速いこともあるみたいですが。。