我了解,字典对象的索引超出范围错误的主要原因之一是线程冲突。 (同时读取和写入同一词典)但是,我遇到了一个令人困惑的情况,其中线程冲突不足以说明问题。

情况如下:
我已经编写了以不安全的方式实现多线程处理的Dictionary的代码。

该代码已作为Web服务在两个服务器(服务器A和服务器B)上实现。服务器通过负载均衡器进行访问,负载均衡器将以循环方式将请求发送到服务器A和B。

现在是棘手的部分。该错误仅显示在服务器A上,而不显示在服务器B上。根据我们的硬件团队,这两个服务器是相同的。尽管线程冲突本质上是一个随机过程,但它仍应同等地影响我的两台服务器。我在一台服务器上看到50多个错误实例,而在另一台服务器上看到了0个实例。从统计上讲,线程冲突仅发生在我的其中一台服务器上,而另一台服务器没有错误运行,这不太可能。

我已经在修改应用程序以使其线程更安全,但是在Dictionary对象的Insert操作中引发此错误的原因还有哪些?

最佳答案



一点也不。它严重依赖于时序。而且时间安排可以重复,系统趋向于适应特定的模式。诸如Microsoft Research的CHESS之类的线程竞争诊断工具通过向线程的执行中注入(inject)随机延迟来工作。为了使系统脱离这种模式。像这样偶尔偶尔会自己做,但一周左右只有一次。那是随机的,只是不够随机,不足以让您调试问题。

因此,看到一台服务器发生故障而不是另一台服务器并不意味着任何事情。负载均衡器可能与此有关。您将永远无法找出确切的原因,因为您无法找出那50次发生了什么事。这还不够。

关于c# - 导致索引的其他原因不在.Net词典中数组的范围之内,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4673736/

10-13 01:58