Application.Exit上的InvalidOperationException

时间:2015-12-21 21:47:13

标签: c# winforms invalidoperationexception

有人可以告诉我为什么exitToolStripMenuItem_Click会抛出InvalidOperationException。我知道它发生的原因是调用了plugin.Close()。但是,我不明白为什么。通过" X"关闭Form1按钮不会触发异常。但是,调用Application.Exit()可以。下面是一个示例,用于演示我的主应用程序中发生的情况。在我的主要应用程序事件被触发关闭某些表单,所以我需要确保我在每个表单上调用Close。我可以将Application.Exit()更改为Close()但是在阅读MSDN之后我不觉得这是正确的解决方案。任何想法都会有所帮助,谢谢。

注意:我正在处理的主要应用程序是多线程的。

public partial class Form1 : Form
{
    Form plugin = new Form();
    public Form1()
    {
        InitializeComponent();
        plugin.Show();
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        plugin.Close();
    }

    private void exitToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Application.Exit();
    }
}

抛出的异常是:

Exception thrown: 'System.InvalidOperationException' in mscorlib.dll
System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
   at System.Collections.ArrayList.ArrayListEnumeratorSimple.MoveNext()
   at System.Windows.Forms.Application.ExitInternal()
   at System.Windows.Forms.Application.Exit(CancelEventArgs e)
   at System.Windows.Forms.Application.Exit()
   at WindowsFormsApplication2.Form1.exitToolStripMenuItem_Click(Object sender, EventArgs e)

1 个答案:

答案 0 :(得分:0)

您不需要Application.Exit()中的exitToolStripMenuItem_Click()。调用Application.Exit,将关闭并处理该表单,同时在exitToolStripMenuItem_Click恢复执行,将抛出ObjectDisposedException。此外,在Windows窗体集合已被修改的情况下,将引发System.InvalidOperationException