关闭表单

时间:2017-07-09 04:02:34

标签: c# winforms

我正在编写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();
                    });
                }
            }

1 个答案:

答案 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?