我有一个小问题。有时,当我尝试调用以下代码时,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 地址,其中该类中的两个字段都是只读的。该程序是多线程的,但我每次使用时都会锁定此类中的字典。
我很无奈。为什么会出现这种异常?
最诚挚的问候
编辑
为了澄清,接受的答案是正确的。生成的异常是跨线程访问我的字典引起的问题。