C# Dictionary 是不是有可能返回一个完全错误的值。

Posted

技术标签:

【中文标题】C# Dictionary 是不是有可能返回一个完全错误的值。【英文标题】:Is it possible C# Dictionary to return a completly wrong value.C# Dictionary 是否有可能返回一个完全错误的值。 【发布时间】:2015-10-21 08:32:35 【问题描述】:

我在多线程环境中有一个 c# 字典。我正在使用 TryGetValue 进行无锁阅读,同时字典正在重组。 是否有可能获得与此键无关的完全不同的值?我的意思不仅仅是一个不是最新的值,而是一个完全错误的值,对应于不同的键。

【问题讨论】:

先展示你的作品。 多线程且无锁?是的,任何事情都可能发生。算你幸运机器没有炸毁。 @Corak 如果不是 Web 应用,请不要忽略应用域隔离等。 @Mathematics - 我支持“任何事情都可能发生”。引用Eric Lippert:“只要拿锁。” 完全看代码... 【参考方案1】:

简短回答:是的!

长答案:字典默认不是线程安全的。如果你需要一个线程安全的,你可以使用ConcurrentDictionaryhttps://msdn.microsoft.com/en-us/library/dd287191(v=vs.110).aspx

还可以查看有关线程安全集合https://msdn.microsoft.com/en-us/library/dd997305(v=vs.110).aspx 的 Microsoft 参考

【讨论】:

你能备份一下吗?我知道 List 如果在迭代时修改集合会引发错误 - 你确定 Dictionary 没有做任何类似的事情吗? @Default 您所描述的行为确实发生在 ListDictionary 上,但它与线程安全访问没有直接关系 - 这是“可能”结束的两件不同的事情出现相同的错误/异常。但我以更一般的方式理解了 Dim_Ka 的问题

以上是关于C# Dictionary 是不是有可能返回一个完全错误的值。的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中是不是有像 Dictionary<> 这样的类,但只有键,没有值?

#yyds干货盘点# C#中的数据字典Dictionary

C#日常C#集合Dictionary获取第一个键值

C# 使用定时器和Dictionary 出现异常说集合已修改,可能无法执行枚举操作,求帮忙啊

C#日常C#集合Dictionary获取第一个键值

C#日常C#集合Dictionary获取第一个键值