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

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

mscorlib.dll中发生了’System.InvalidOperationException’类型的第一次机会exception

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

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

堆栈跟踪不是很有用:

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框架的底层状态。

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

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

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

  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]"); }