0

已解决:代码每 10 毫秒通过事件执行一次,增加了事件之间的时间解决了问题。

我正在经历一个奇怪的IndexOutOfRangeException应该发生的奇怪事件。即使语句本身为“假”,仍在使用 if 语句中的代码。这是一个已知问题吗?如果是这样,我该如何解决这个问题?

当计数器 (an) 为 0 时发生错误,因此向Lightsint请求。element -1array

代码:

 if (counter  > 0)
    {
    Console.WriteLine("counter-1 is groter dan 0");
    int i = counter - 1;
    Lights[i].setState(0);
    }
4

5 回答 5

1

如果这是一个没有任何其他代码变异的单线程应用程序counter,那么最可能的解释是Lights根本不够长。例如,如果counteris 1(我想你会同意,> 0- 所以if测试会通过),并且Lights是一个零长度数组,那么Lights[i]( Lights[0]) 将引发这个异常 - 或者 if counteris 200but Lights.Lengthis 199(或更少) -因为Lights[i]( Lights[199]) 超出范围0- 198

检查Lights.Length

于 2013-05-21T09:25:14.020 回答
1

除非以多线程方式访问/操作计数器 - 这应该是一个不可能的状态。

您可以随时尝试在一个地方进行分配和检查:

 var index = 0;

 if ((index = (counter - 1))  > 0)
 {
    Lights[index].setState(0);
 }
于 2013-05-21T08:50:51.287 回答
0

计时器每 10 毫秒触发一次事件。这创造了以下可能性:

  • 程序在事件 A 期间进入 if 语句。
  • 一个新的事件 B 被触发并且 CPU 处理事件 B。
  • 事件 B 将计数器更改为负值,从而使 if 语句为假。
  • CPU 发生变化以处理事件 A。
  • 即使 if 语句本身是错误的,程序现在也在 if 语句中。

这个问题已经通过减少事件触发的频率得到解决。

于 2014-07-07T07:37:33.220 回答
0

如果后台没有其他线程发生变化counter,那么唯一可能的解释是Lights[]集合的大小为零。

Lights在访问其元素之前尝试检查其长度。

于 2013-05-21T09:01:40.310 回答
0

试试这样

int i=0;
if (counter  > 0)
{
 Console.WriteLine("counter-1 is groter dan 0");
 i = counter - 1;
 Lights[i].setState(0);
}
于 2013-05-22T11:03:19.407 回答