我一致地在多线程.net 3.5应用程序上得到了这个错误
错误26引发的异常。详细信息:'System.IndexOutOfRangeException: Index超出了数组的界限。 在System.Collections.Generic.Dictionary
2.Insert(TKey key, TValue value, Boolean add) at System.Collections.Generic.Dictionary2.Add(TKey键处,TValue值)
我想我知道如何修复它(在批准的地方添加锁),但是我希望能够在我的本地环境中重新创建这个问题,所以我将确定我修复了它,也能够为它添加一个单元测试。
你知道有什么一致的方法来重现这一切吗?
发布于 2012-10-05 14:24:51
Dictionary<string, string> dict = new Dictionary<string, string>();
Task.Factory.StartNew(() => { while (true) dict["a"] = "a"; });
Task.Factory.StartNew(() => { while (true) dict.Remove("a"); });发布于 2012-10-05 14:22:16
不幸的是,在发生争用条件的多线程应用程序中保持一致性是根本无法实现的。
您的机器与生产机器之间的硬件差异将确保当问题确实发生时,它可能不在同一位置。即使硬件是相同的,软件差异(特别是那些后台服务)也会导致时间上的差异,从而导致无法重复的情况。
见鬼,如果这些线程依赖于外部资源(比如DB调用),那么生产和测试框之间的网络延迟差异可能会确保您永远不会复制它。
避免在服务器上安装调试器(糟糕的想法),您能做的最好的事情就是对代码进行可视化分析,修复您认为需要修复的部分,测试它(以及您可以测试的部分),然后发布并在生产中查看它。
发布于 2012-10-05 14:27:14
这不会帮助您在本地重新创建错误,但是要完全删除错误,泛型Dictionary的msdn文档表示:
有关线程安全选项,请参见ConcurrentDictionary。
ConcurrentDictionary的文档说:
表示可由多个线程并发访问的键值对的线程安全集合.
注意到,ConcurrentDictionary只在.Net 4和更高版本中可用。
https://stackoverflow.com/questions/12748275
复制相似问题