0

プログラムにはポップアップするフォームがあり、いくつかのフィールドにテキストを入力して閉じるを押します。閉じると、入力された情報がクラスに保存されnewItemます。

F5 を押してプログラムをデバッグすると、すべて正常に動作します。しかし、デバッグ フォルダーから実行可能ファイルを実行すると、このエラーが発生します。

System.ArgumentException: An item with the same key has already been added.
    At.... line 168

これがコードです。

if (!LoadedItem.Contains(newItem))
{
    LoadedItem.Add(newItem);
}

ブレークポイントを配置し、コードをステップ実行すると、すべてが正常に機能するように見えます。LoadedItemすでに含まれている場合はスキップしnewItemます。しかし、何らかの理由で、.exe の if ステートメントを無視しているように見えます。

さらに必要な情報がある場合はお知らせください。

私の人生では、なぜこれが起こっているのかわかりません。

4

2 に答える 2

3

ロックLoadedItemが機能するはずです

lock(LoadedItem) {
    if (!LoadedItem.Contains(newItem))
       LoadedItem.Add(newItem);
}

LoadedItem との間で読み書きするコード内のすべてのポイントでロックを使用する必要があることに注意してください。

書くよりも読む方が多い場合は、ReaderWriterLockSlimパフォーマンスを向上させるために使用してください。

.Net4 を使用している場合は、System.Collections.Concurrent名前空間のコレクションの一部を使用できます。

于 2012-08-29T19:19:49.050 に答える
1

これはスレッドの問題のように聞こえます。LoadedItem と NewItem がローカルにバインドされた変数であることを確認してください。これにより、2 つの参照が同じオブジェクトであることが保証されます。

デバッグの目的で、"Contains" と "Add" を、動作を調査できるラッパー関数に置き換えます。

于 2012-08-29T17:33:19.460 に答える