C#exception:字典中不存在键

时间:2009-10-18 08:43:24

标签: c# multithreading dictionary keynotfoundexception

我有点问题。有时,当我尝试调用以下代码时,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。

我很无奈。为什么会出现这种异常?

最好的问候

修改

为澄清,接受的答案是正确的。生成的异常是由对我的字典的跨线程访问引起的问题。

2 个答案:

答案 0 :(得分:2)

Remove方法不应该抛出这样的异常,如果找不到密钥,它应该返回false(参见here)。 而不是删除和添加,为什么不尝试更新密钥的值?

答案 1 :(得分:0)

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