我正在编写WinForms C#程序。
我正在尝试关闭除主要表单FrmMain
以外的所有表单。
我必须隐藏我的主要表格。
我通过打开两个表单来制作它。一个是我的主要表单,一个是另一个表单,用ShowDialog()
方法显示。
在我的机器上执行此代码时,它似乎应该正确关闭所有表单。出于某种原因,当我没有设置断点并运行这段特定代码时,我得到ArgumentOutOfRangeException
因为变量i
到达-1
的点。当我设置断点,并慢慢地逐步执行每一段代码时,它工作正常。
for循环继续i
到达-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();
});
}
}
答案 0 :(得分:1)
基本上,for
循环仅在条件为假时终止,这意味着i
必须在-1
停止之前到达BeginInvoke
。看到
When does iteration variable in for loop increment应该提供一个很好的解释。
结合您使用i
的事实,这实际上将执行移动到一个单独的线程(意味着它的执行可能会被延迟),而i
是一个捕获变量当-1
被调用时,Dispose()
完全有可能s1 = s1.replaceAll(s1.charAt(i) + "", "");
i--;
。
当你有断点时,你可能会放慢主线程的执行速度,以至于所有单独的线程都以预期的顺序运行,所以你不会看到问题。 / p>
您可以在此处找到有关已捕获变量的信息:What are 'closures' in .NET?