10

我遇到了这个非常非常奇怪的错误,我一直无法确定(这种情况很少发生)。基本上,我有一个 C# 应用程序在退出时随机抛出一个未知异常。这次我设法在调试器中捕获了它,结果发现调用Application.Exit()抛出了System.InvalidOperationException以下消息:

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

附加信息:集合已修改;枚举操作可能无法执行。

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

堆栈跟踪不是很有帮助:

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

知道如何找出已修改的 ArrayList 吗?我不认为这是我正在做的任何事情,更可能是我正在做的一个动作,即在 MS 没想到的操作中间修改 .NET 框架的底层状态。

4

2 回答 2

19

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

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

于 2011-10-27T09:57:04.533 回答
1

我们也只是在这个问题上花了几天时间......我们得到了“System.InvalidOperationException”异常和应用程序(在这种情况下使用来自 DynamSoft 的 twain 库)。显然我们不应该在调用 application.exit 之后调用 CLOSE()。注释掉 Close 会使异常消失,并使应用程序正常结束。从视觉上看,该应用程序会显示一个来自 Microsoft 的奇怪消息框,上面写着“您想提交有关此问题的更多信息” - 什么问题?在此之前它没有显示任何内容,所以我们开始挖掘堆栈跟踪。

                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]");
            }
于 2015-03-04T01:19:50.647 回答