我正在写一个WinForms C#程序.
我试图关闭除主要形式FrmMain之外的所有形式.
我必须隐藏我的主要表格.
我通过打开两种形式来制作它.一个使用我的主窗体,另一个使用ShowDialog()方法显示另一个窗体.
在我的机器上执行此代码时,它似乎应该正确关闭所有表单.出于某种原因,当我没有设置断点并运行这段特定代码时,我得到一个ArgumentOutOfRangeException,因为变量i到达-1的点.当我设置断点,并慢慢地逐步执行每一段代码时,它工作正常.
for循环继续一直让我达到-1是没有意义的,因为我有i> = 0条件.
有人可以向我解释为什么当我不使用断点时i的索引达到-1但是当我使用断点并单独循环遍历循环的每一行时它变为0?
可以做些什么来解决这个问题?
提前致谢.
for (int i = Application.OpenForms.Count - 1; i >= 0; i--)
{
if (Application.OpenForms[i] is FrmMain)
{
Application.OpenForms[i]?.BeginInvoke((MethodInvoker)delegate
{
Application.OpenForms[i]?.Hide();
});
}
else
{
Application.OpenForms[i]?.BeginInvoke((MethodInvoker)delegate
{
Application.OpenForms[i]?.Dispose();
});
}
}
编辑:
我阻止获取ArgumentOutOfRangeException的方法是在for循环中添加另一个变量.
这是我改变的代码.
for (int i = Application.OpenForms.Count - 1; i >= 0; i--)
{
int i1 = i;
if (Application.OpenForms[i] is FrmMain)
{
Application.OpenForms[i]?.BeginInvoke((MethodInvoker)delegate
{
Application.OpenForms[i1]?.Hide();
});
}
else
{
Application.OpenForms[i]?.BeginInvoke((MethodInvoker)delegate
{
Application.OpenForms[i1]?.Dispose();
});
}
}
最佳答案 本质上,for循环仅在条件为false时终止,这意味着我必须在它停止之前达到-1.看到
When does iteration variable in for loop increment应该提供一个很好的解释.
结合你正在使用BeginInvoke的事实,它实际上将执行移动到一个单独的线程(意味着它的执行可能被延迟),并且我是一个捕获的变量,当调用Dispose()时,i完全有可能为-1 .
当你有断点时,你可能放慢了主线程的执行速度,以至于所有单独的线程都以预期的顺序运行,所以你不会看到问题.
您可以在此处找到有关捕获变量的信息:What are ‘closures’ in .NET?