关闭表单时出现C#ArgumentOutOfRangeException

我正在写一个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?

点赞