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

Mah*_*dsi 8 .net c# 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框架的基础状态.

Han*_*ant 18

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

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

  • @Hans Passant,有完全相同的问题; 果然,我在`Form_CLOSING`方法中显示了一个消息框.繁荣,同样的收藏修改.真傻.把它移到了'Form_CLOSED`并且很好.有点奇怪,但嘿,勇敢的结果. (2认同)