0

少し問題が発生しました。次のコードを呼び出そうとすると、remove メソッドが例外をスローし、「キーがディクショナリに存在しません」というメッセージが表示されることがあります。

private Dictionary<IPAddress, ARPHostEntry> dIPHostTable;
private Dictionary<MACAddress, ARPHostEntry> dMACHostTable;

public HostTable()
{
    dIPHostTable = new Dictionary<IPAddress, ARPHostEntry>();
    dMACHostTable = new Dictionary<MACAddress, ARPHostEntry>();
}

public void AddHost(ARPHostEntry arphEntry)
{
    lock (dMACHostTable)
    {
        if (dMACHostTable.ContainsKey(arphEntry.MAC))
        {
            dMACHostTable.Remove(arphEntry.MAC);
        }
        dMACHostTable.Add(arphEntry.MAC, arphEntry);
    }
    lock (dIPHostTable)
    {
        if (dIPHostTable.ContainsKey(arphEntry.IP))
        {
            dIPHostTable.Remove(arphEntry.IP);
        }
        dIPHostTable.Add(arphEntry.IP, arphEntry);
    }
}

クラス ARPHostEntry は、このクラスの両方のフィールドが読み取り専用である IP アドレスと関連付けられた MAC アドレスを保持する単純なクラスです。プログラムはマルチスレッドですが、辞書を使用するたびにこのクラスの辞書をロックします。

私は無力です。この例外が発生するのはなぜですか?

敬具

編集

明確にするために、受け入れられた答えは正しいです。生成された例外は、辞書へのクロススレッド アクセスによって引き起こされた問題でした。

4

2 に答える 2

2

キーが見つからない場合、Remove メソッドはそのような例外をスローすべきではありません (こちらを参照)。削除して追加する代わりに、キーの値を更新してみませんか?

于 2009-10-18T08:50:00.887 に答える
0

スレッド間でホスト テーブルを本当に共有しているかどうかは、この例からはわかりません。プライベート ホスト テーブルも静的であるべきではありませんか?

于 2009-10-20T23:50:42.300 に答える