由于在调用Application.Exit()时修改集合而导致的System.InvalidOperationException

时间:2011-10-27 05:33:03

标签: c# .net invalidoperationexception

我有这个非常,非常奇怪的错误,我从来没有能够确定(它很少发生)。基本上,我有一个C#应用程序在退出时随机抛出一个未知的异常。我这次设法在调试器中捕获了它,结果是调用Application.Exit()正在抛出System.InvalidOperationException,并显示以下消息:

  

mscorlib.dll中出现'System.InvalidOperationException'类型的第一次机会异常

     

其他信息:收集已修改;枚举操作可能无法执行。

我不确定 这个据称被修改过的集合是什么,或者是谁修改了它。

堆栈跟踪不是很有帮助:

  

mscorlib.dll中!System.Collections.ArrayList.ArrayListEnumeratorSimple.MoveNext()   + 0x13f bytes System.Windows.Forms.dll!System.Windows.Forms.Application.ExitInternal()   + 0x112 bytes System.Windows.Forms.dll!System.Windows.Forms.Application.Exit(System.ComponentModel.CancelEventArgs   e)+ 0x65字节

知道如何找出已经修改过的ArrayList吗?我不认为这是我正在做的任何事情,更可能是我正在做的一个动作,即在MS没有预料到的操作过程中修改.NET框架的基础状态。

2 个答案:

答案 0 :(得分:18)

不寻常,从未见过这个。 Application.ExitInternal()方法迭代Application.OpenForms集合。很明显,这个集合正在进行修改。造成这种情况的可能原因很少,我只想出一个。其中一个表单已重写OnFormClosing()方法或订阅了FormClosing事件。并且正在做一些修改OpenForms集合的东西。可以处理表单对象或创建新表单实例或修改导致窗口重新创建的表单属性,如ShowInTaskbar。

您将无法在调用堆栈中找到此代码。查看On / FormClosing代码。如果您无法快速找到,请注释代码。

答案 1 :(得分:1)

我们在这个问题上花了好几天......我们得到了'System.InvalidOperationException'异常,以及app(在这种情况下使用DynamSoft的twain库)。显然我们在调用application.exit之后不应该调用CLOSE()。评论出关闭使得异常消失,并使应用程序正常结束。在视觉上,该应用程序将显示一个奇怪的消息框,从微软说“你想提交有关这个问题的更多信息” - 问题是什么?在此之前它没有显示任何东西,所以关闭我们去挖掘堆栈跟踪。

                Utils.Logger.Info("", "AsystScanner/dynamicDotNetTwain2_OnPostAllTransfers");
                Utils.Logger.Info("Closing down application!", "AsystScanner/dynamicDotNetTwain2_OnPostAllTransfers");

                // caller should close down app, added 3/3/15
                dynamicDotNetTwain2.CloseSource();
                dynamicDotNetTwain2.CloseSourceManager();

                System.Windows.Forms.Application.Exit();
no no!  don't do a close here.
                //try
                //{
                //    Close();
                //}
                //catch (Exception ex)
                //{
                //    MessageBox.Show(ex.Message + "  Routine=dynamicDotNetTwain2_OnPostAllTransfers/Close() statement failed. [EJS1503031630]");
                //}
                return;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + "  Routine=dynamicDotNetTwain2_OnPostAllTransfers [EJS1503031631]");
            }