【问题标题】:Can you explain this System.Collections.Generic.KeyNotFoundException?你能解释一下这个 System.Collections.Generic.KeyNotFoundException 吗?
【发布时间】:2011-04-06 14:54:28
【问题描述】:

我有以下代码:

mCommandMap[command.pId] = new System.Threading.ManualResetEvent(false);
SendCommandASync(command);
mCommandMap[command.pId].WaitOne();

其中mCommandMapDictionary<string, ManualResetEvent>pId 是始终从GUID.NewGuid().ToString() 创建的字符串

现在我在调试器中抛出 KeyNotFoundException 的那一行。调试器告诉我字典中有一项,并且它有一个与我要求的完全相同的键。去图。

这也是偶尔发生的。并非总是如此。

问题是,WTF?

【问题讨论】:

    标签: c# multithreading dictionary


    【解决方案1】:

    我猜你在多个线程中操作command,它的pId 最终会改变。

    或者,您在多个线程中操作mCommandMap 而不锁定。

    尝试在代码周围添加lock()

    【讨论】:

    • 不。调试器说字符串在那里。
    • 偶尔发生 + 事后观察状态时似乎一切正常 + 涉及多线程 = 99% 的机会您遇到上述的竞争条件。
    • @Kugel:然后是字典。 Dictionary<T, U> 不是线程安全的。你不应该在没有同步的情况下添加和获取项目,因为你会得到意想不到的结果。请注意,将代码分解为调试器可能会显着改变行为,使其难以观察。
    • @Mark 这不是之后。我在调试器中,我实际上可以看到该项目在那里,但它仍然抛出。
    • @Kugel:您能尝试用System.Collections.Concurrent.ConcurrentDictionary 替换标准的Dictionary 吗?
    猜你喜欢
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 2021-04-22
    • 2011-01-21
    • 1970-01-01
    相关资源
    最近更新 更多