代码如下,无关代码已经去掉了,整个函数稍长,一屏显示不完:
private void TaskTest()
{
int ver = 3;
int hor = 2;
int[,] result = new int[ver, hor];
while (!_CTS.IsCancellationRequested)
{
try
{
for (int i = 0; i < hor; i++)
{
for (int j = 0; j < ver; i++)
{
result[i, j] = CalculateSomething();
}
}
BreakPoint();
}
catch (Exception e)
{
}
}
}
什么“不可思议”的问题呢?
嗯,我发现两层for循环直接陷入死循环了,断点打在BreakPoint调用处,程序打死运行不到那里。
再把断点打在CalculateSomething处,眼睁睁看着j从0到1,i从0到2,又从头来,就是跑不到BreakPoint。
嘿,我就奇了怪了,for循环这么简单的都要出问题?
是不是i和j哪里写错了?检查了,没有。
难道是内存越界?没有用unsafe代码啊。
难道我无意中发现了c#的惊天大BUG?不会吧?还是有点不自信,再检查一下。
单步跟踪,直到 i = 2, j = 0, CalculateSomething那里。。。
触发了一个异常,跳到了catch异常捕获那里,然而那里一片空白,于是
又愉快地回到while开头,又开始for循环。。。
好吧,这样坑自己其实不是第一次了,前两天才出了数据库访问异常,连接没有正常关闭,导致连接溢出的问题。
自己把自己坑了为什么还这么开心呢^o^
本文深入探讨了一段C#代码中的诡异现象:一个看似普通的双层for循环陷入了死循环,且无法到达BreakPoint()调用处。通过逐步分析,作者发现异常触发并被空catch块捕获,导致程序不断重复循环。本文揭示了异常处理不当可能导致的陷阱。

被折叠的 条评论
为什么被折叠?



