【问题标题】:C# exception: Key is not present in the dictionaryC# 异常:字典中不存在键
【发布时间】:2009-10-18 08:43:23
【问题描述】:

我遇到了一个小问题。有时,当我尝试调用以下代码时,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 地址,其中该类中的两个字段都是只读的。 程序是多线程的,但是我每次使用时都会锁定这个类中的字典。

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

致以最诚挚的问候

编辑

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

【问题讨论】:

    标签: c# multithreading dictionary keynotfoundexception


    【解决方案1】:

    Remove 方法不应抛出此类异常,如果未找到密钥,则应返回 false(请参阅here)。 与其删除和添加,不如尝试更新键的值?

    【讨论】:

    • O_O。好的,我会重新检查一下。奇怪的。我将尝试仅更新该值。谢谢。
    • 我可能有点晚了,但我按照您的建议进行了修复。与调用类中的更清晰的多线程模型 (ISyncrhonizeInvoke) 一起,它现在可以工作了。
    【解决方案2】:

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

    【讨论】:

    • 不,我需要这个类的多个实例用于多个网络接口,这些网络接口与许多其他实现更高层和许多线程的对象共享。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多