C#如果使用了错误的语句

C#如果使用了错误的语句,c#,if-statement,runtime-error,C#,If Statement,Runtime Error,已解决:每10毫秒通过事件执行一次代码,增加了事件之间解决问题所需的时间 我遇到了一个奇怪的索引异常,这是不应该发生的。正在使用if语句中的代码,即使该语句本身为“false”。这是一个已知的问题吗?如果是,我如何解决这个问题 当计数器(一个int)为0,从而从数组中请求元素-1时,会发生错误 代码: 除非以多线程方式访问/操作计数器,否则这应该是不可能的状态 您始终可以尝试在一个位置进行分配和检查: var index = 0; if ((index = (counter - 1))

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

我遇到了一个奇怪的
索引异常
,这是不应该发生的。正在使用if语句中的代码,即使该语句本身为“false”。这是一个已知的问题吗?如果是,我如何解决这个问题

当计数器(一个
int
)为0,从而从
数组中请求
元素-1
时,会发生错误

代码:


除非以多线程方式访问/操作计数器,否则这应该是不可能的状态

您始终可以尝试在一个位置进行分配和检查:

 var index = 0;

 if ((index = (counter - 1))  > 0)
 {
    Lights[index].setState(0);
 }

如果没有其他线程在后台更改
计数器
,那么唯一可能的解释是
Lights[]
集合的大小为零


在访问其元素之前,请尝试检查
灯的长度。

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

检查灯光。长度

像这样试试

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

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

  • 程序在事件A期间进入if语句
  • 一个新的事件B被触发,CPU负责处理事件B
  • 事件B将计数器更改为负值,从而使if语句为false
  • CPU正在更改以处理事件A
  • 程序现在位于if语句内部,即使if语句本身为false

通过减少触发事件的频率,问题得到了解决。

是否从其他线程访问“计数器”?很抱歉,这不可能是正确的。如果If语句为false,则不会执行语句中的代码,除非您有多线程问题。你能发布更多的代码吗?这样我们就可以看到你在做什么了。这里可以看到错误的图像:看到它我也很惊讶。。该应用程序是一个单线程应用程序,计数器是一个专用变量。如何设置计数器?还有哪个函数访问它?清理和重建解决方案有帮助吗?但这是否解释了尽管条件求值为false@tariq我不相信这是真的。我认为实际情况是,
Lights[]
的大小为零。但我同意链接图片中的信息看起来确实很奇怪。调试器肯定会将计数器显示为零。我怀疑某些奇怪的生成问题可能掩盖了真正的原因。@MatthewWatson:我认为工具提示将计数器显示为0,因为在输入if语句之前它是1,然后它被递减(当前行是递减之后的行)。另一个工具提示imho在鼠标悬停时被计算,因此在该时间点
计数器>0
false
,这只会使代码更难读取,也更难调试imho。它对线程安全没有任何作用。是的,我就是这么想的!但是当我看到op发布的调试器中的错误消息时,我变得非常不确定!(由于某些原因,我无法在此处重新发布链接…)问题尚未解决,只是可能会出现使用互斥锁来锁定该语句的情况可能是一种选择,但这需要我锁定可能导致问题的每个语句。该程序设计为在特定硬件上运行,因此其限制是已知的,并且在项目期间不会改变。
int i=0;
if (counter  > 0)
{
 Console.WriteLine("counter-1 is groter dan 0");
 i = counter - 1;
 Lights[i].setState(0);
}