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