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 方法不应抛出此类异常,如果未找到密钥,则应返回 false(参见此处)。你为什么不尝试更新键的值,而不是删除和添加?

于 2009-10-18T08:50:00.887 回答
0

从您的示例中不清楚您是否真正跨线程共享主机表。私有主机表不应该也是静态的吗?

于 2009-10-20T23:50:42.300 回答