首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重新创建“索引超出数组的界限”,将项添加到字典中?

如何重新创建“索引超出数组的界限”,将项添加到字典中?
EN

Stack Overflow用户
提问于 2012-10-05 14:19:03
回答 4查看 9.3K关注 0票数 12

我一致地在多线程.net 3.5应用程序上得到了这个错误

错误26引发的异常。详细信息:'System.IndexOutOfRangeException: Index超出了数组的界限。 在System.Collections.Generic.Dictionary2.Insert(TKey key, TValue value, Boolean add) at System.Collections.Generic.Dictionary2.Add(TKey键处,TValue值)

我想我知道如何修复它(在批准的地方添加锁),但是我希望能够在我的本地环境中重新创建这个问题,所以我将确定我修复了它,也能够为它添加一个单元测试。

你知道有什么一致的方法来重现这一切吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-05 14:24:51

代码语言:javascript
复制
Dictionary<string, string> dict = new Dictionary<string, string>();

Task.Factory.StartNew(() => { while (true) dict["a"] = "a"; });
Task.Factory.StartNew(() => { while (true) dict.Remove("a"); });
票数 9
EN

Stack Overflow用户

发布于 2012-10-05 14:22:16

不幸的是,在发生争用条件的多线程应用程序中保持一致性是根本无法实现的。

您的机器与生产机器之间的硬件差异将确保当问题确实发生时,它可能不在同一位置。即使硬件是相同的,软件差异(特别是那些后台服务)也会导致时间上的差异,从而导致无法重复的情况。

见鬼,如果这些线程依赖于外部资源(比如DB调用),那么生产和测试框之间的网络延迟差异可能会确保您永远不会复制它。

避免在服务器上安装调试器(糟糕的想法),您能做的最好的事情就是对代码进行可视化分析,修复您认为需要修复的部分,测试它(以及您可以测试的部分),然后发布并在生产中查看它。

票数 4
EN

Stack Overflow用户

发布于 2012-10-05 14:27:14

这不会帮助您在本地重新创建错误,但是要完全删除错误,泛型Dictionary的msdn文档表示:

有关线程安全选项,请参见ConcurrentDictionary

ConcurrentDictionary的文档说:

表示可由多个线程并发访问的键值对的线程安全集合.

注意到,ConcurrentDictionary只在.Net 4和更高版本中可用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12748275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档