收集被修改;枚举操作可能无法执行#10897

时间:2017-11-14 23:39:42

标签: vb.net winforms exception

我发现这个错误已经有很多问题了。我已经阅读了所有这些,几乎每一个都是因为他们在枚举时修改了一个集合,这很明显。但是,我的情况有所不同。

所以这是有问题的例外。请注意我修改的最后一行。

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表单加载代码中,我几乎感觉不到其他问题。也许管理开放形式或其他东西的东西......不知道,只是在这一点上疯狂猜测。有没有人对我应该开始调查的地方有任何想法?

1 个答案:

答案 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
                        }
                    }
                }