![](/img/trans.png)
[英]c# - ArgumentOutOfRangeException: Index was out of range - 2 Forms
[英]C# ArgumentOutOfRangeException when closing forms
我正在编写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();
});
}
}
本质上, for
循环仅在条件为false时终止,这意味着i
必须先达到-1
才能停止。 请参阅何时for循环增量中的迭代变量应提供良好的解释。
结合您使用BeginInvoke
的事实,它实际上将执行移动到单独的线程(这意味着执行可能会延迟),并且i
是一个捕获变量,当调用Dispose()
时, i
完全有可能为-1
。
有了断点后,您可能会减慢主线程的执行速度,以至于所有单独的线程都按预期的顺序运行,因此不会出现问题。
您可以在此处找到有关捕获的变量的信息: .NET中的“闭包”是什么?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.