我发现这个错误已经有很多问题了。我已经阅读了所有这些,几乎每一个都是因为他们在枚举时修改了一个集合,这很明显。但是,我的情况有所不同。
所以这是有问题的例外。请注意我修改的最后一行。
Source mscorlib
Method MoveNext
Message Collection was modified; enumeration operation may not execute.
Exception System.InvalidOperationException
Stack
at System.Collections.ArrayList.ArrayListEnumeratorSimple.MoveNext()
at System.Windows.Forms.Application.ExitInternal()
at System.Windows.Forms.Application.ThreadContext.OnThreadException(Exception t)
at System.Windows.Forms.Control.WndProcException(Exception e)
at System.Windows.Forms.Control.ControlNativeWindow.OnThreadException(Exception e)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.RunDialog(Form form)
at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
at System.Windows.Forms.Form.ShowDialog()
at RandomEventWithinMyApp()
我个人从未见过错误或能够重现错误。我从来没有见过这个错误报告不时来自用户,它总是让我不知所措。
正如您所看到的,错误发生在System.Windows.Forms.Form.ShowDialog中,因此在尝试打开表单时出现问题。显然我没有一个名为RandomEventWithinMyApp的函数,而是在控件事件中随机出现错误,通常是单击按钮,因为这通常会触发用户打开某个表单。
现在,如果在用户单击同一按钮打开相同的特定表单时始终发生错误,那么解决问题会容易得多。问题是触发错误的事件是随机的,它可以是在应用程序中的任何位置打开表单的任何事件(例如按钮单击)。发生错误时打开的表单也是随机的。所以我没什么好过的。
在.Net表单加载代码中,我几乎感觉不到其他问题。也许管理开放形式或其他东西的东西......不知道,只是在这一点上疯狂猜测。有没有人对我应该开始调查的地方有任何想法?
答案 0 :(得分:0)
我会检查任何表格结束事件,甚至形成已结束的事件。您可以在MSDN上浏览.Net源代码,并看到它在Application.ExitIntenal中迭代表单的arraylist以引发FormClosing事件。表单中的某些内容可能正在关闭正在修改正在迭代的arraylist的事件。
// Raise the FormClosing and FormClosed events for each open form
if (forms != null) {
foreach (Form f in OpenFormsInternal) {
if (f.RaiseFormClosingOnAppExit()) {
cancelExit = true;
break; // quit the loop as soon as one form refuses to close
}
}
}