我有点问题。有时,当我尝试调用以下代码时,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类是一个简单的calss,它包含一个IP地址和一个相关的MAC地址,此类中的两个fiel都是只读的。 该程序是多线程的,但每次我使用它时都会在这个类中锁定dictionarys。
我很无奈。为什么会出现这种异常?
最好的问候
修改
为澄清,接受的答案是正确的。生成的异常是由对我的字典的跨线程访问引起的问题。
答案 0 :(得分:2)
Remove方法不应该抛出这样的异常,如果找不到密钥,它应该返回false(参见here)。 而不是删除和添加,为什么不尝试更新密钥的值?
答案 1 :(得分:0)
从您的示例中不清楚您是否真正在跨线程共享主机表。私有主机表也不应该是静态的吗?