2012-10-05 15 views
9

私はconsistenlty辞書に項目を追加すると、「インデックスが配列の境界外にありました」を再作成する方法はありますか?

ERROR 26例外がスローされたマルチスレッドの.NET 3.5アプリケーションでこのエラーを取得しています。詳細: 'System.IndexOutOfRangeException:インデックスは、配列の境界 の範囲外でした。 System.Collections.Generic.Dictionary`2.Insert(処理鍵キー、TValue値、ブールアドオン)で

System.Collections.Generic.Dictionary`2.Add(処理鍵キー、TValue値)

私はそれを修正する方法を知っていると思いますが(ロックを付け加えると便利ですが)、私のローカル環境でこの問題を再現できるようにしたいので、私はそれを修正し、そのユニットテストを追加する。

これを再現する一貫した方法をご存知ですか?

+0

「ConcurrentDictionary」を使用していない特別な理由はありますか? – Sconibulus

+0

@Sconibulus:このアプリは3です。5、 'ConcurrentDictionary'を使うことはできません:( – StackOverflower

答えて

8
Dictionary<string, string> dict = new Dictionary<string, string>(); 

Task.Factory.StartNew(() => { while (true) dict["a"] = "a"; }); 
Task.Factory.StartNew(() => { while (true) dict.Remove("a"); }); 
+0

はい、これは辞書エラーですが、演奏中のOPのコードの残りと彼の提案した解決方法によっては、これは正確ではありません – NotMe

+0

このコードでは、私は問題を再現することができますが、残念ながら実際のコードと同じことを言うことはできません。ありがとう! – StackOverflower

4

競合状態が発生するマルチスレッドアプリケーションで一貫性を保つことは、単に達成できません。

マシンとプロダクションマシンのハードウェアの違いだけで、問題が発生したときに同じ場所にないことがあります。ハードウェアが同じであっても、ソフトウェアの違い(特にバックグラウンド・サービス)によってタイミングの違いが生じることがあります。

これらのスレッドが外部リソース(DB呼び出しのような)に依存する場合、本番環境とテストボックスの間のネットワークの待ち時間の違いによって、決して複製できないことがあります。

サーバ上にデバッガを置いている(悪い悪い考え方)ので、コードを視覚的に分析し、修正する必要があると思われる部分を修正し、テストすることができます)その後、リリースし、プロダクションで見る。

+0

+1にお返事ありがとうございます – StackOverflower

1

これはローカルにエラーを再現するために、あなたを助けにはなりませんが、完全にエラーを削除するには、一般的なDictionary<TKey, TValue>については、MSDNのドキュメントは言う:スレッドセーフな代替のために

ConcurrentDictionary<TKey, TValue>を参照してください。

ConcurrentDictionary<TKey, TValue>ためのドキュメントは言う:

は、同時に複数のスレッドによって にアクセスすることができるキーと値のペアのスレッドセーフなコレクションを表します。しかし

。なお、ConcurrentDictionary <処理鍵、TValue >アップネット4とでのみ利用可能です。

+0

私のアプリは3.5です、 'ConcurrentDictionary'を使うことはできません:( – StackOverflower

0

なぜ、ReaderWriterLockSlimを持つディクショナリのラッパーを作成しないでください。そうすれば、すべてのロックが1つのクラスで実行されます。

関連する問題