if (Int32.Parse(strTotals) == 0 && nTotalCount != 0)
{
nTotalCount = 0;
for (int j = 0; j < 66; j++)
{
if (GameHistoryPicBox1[j].InvokeRequired)
{
GameHistoryPicBox1[j].BeginInvoke(new MethodInvoker(() =>
{
if ((j + j / 6) % 2 == 0)
GameHistoryPicBox1[j].Image = Properties.Resources.al1; // Line2
else
GameHistoryPicBox1[j].Image = Properties.Resources.al2; // Line4
}));
}
else
{
if ((j + j / 6) % 2 == 0)
GameHistoryPicBox1[j].Image = Properties.Resources.al1;
else
GameHistoryPicBox1[j].Image = Properties.Resources.al2;
}
}
}
我一直在使用线程检查 nTotalCount
值。
如果nTotalCount
为零,那么我必须清理所有游戏图片框图像。
所以我实现了上面的代码。
不幸的是,我得到了错误:
An unhandled exception of type 'System.IndexOutOfRangeException'
在 2 号线和 4 号线上。
j
的值为 66
。
j
的值可能是 66
吗?
最佳答案
这是因为闭包的工作原理。您正在创建并传递给 MethodInvoker
的 lambda 表达式通过引用引用了 j
变量。因此,当这段代码正在执行时(几乎可以在任何时候执行,因为它是异步的),j
变量可以具有从 0
到 66< 的任何值
。循环结束后可以是66
。
一个快速的解决方法是复制j
:
int index = j;
GameHistoryPicBox1[index].BeginInvoke(new MethodInvoker(() =>
{
if ((index + index / 6) % 2 == 0)
GameHistoryPicBox1[index].Image = Properties.Resources.al1; // Line2
else
GameHistoryPicBox1[index].Image = Properties.Resources.al2; // Line4
}));
您可以阅读更多相关信息 here .
关于c# - 需要 'System.IndexOutOfRangeException'解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19712020/