少し問題が発生しました。次のコードを呼び出そうとすると、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 アドレスを保持する単純なクラスです。プログラムはマルチスレッドですが、辞書を使用するたびにこのクラスの辞書をロックします。
私は無力です。この例外が発生するのはなぜですか?
敬具
編集
明確にするために、受け入れられた答えは正しいです。生成された例外は、辞書へのクロススレッド アクセスによって引き起こされた問題でした。