我遇到了这个非常非常奇怪的错误,我一直无法确定(这种情况很少发生)。基本上,我有一个 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 框架的底层状态..
不寻常,以前从未见过。 Application.ExitInternal() 方法迭代 Application.OpenForms 集合。显然,这个集合在这样做时正在被修改。造成这种情况的可能原因很少,我只能想到一个。您的表单之一已重写 OnFormClosing() 方法或订阅了 FormClosing 事件。并且正在做一些修改 OpenForms 集合的事情。可能是处置表单对象或创建新的表单实例或修改导致重新创建窗口的表单属性,例如 ShowInTaskbar。
您将无法在调用堆栈中找到此代码。检查您的 On/FormClosing 代码。如果您无法快速找到代码,请将代码注释掉。
我们也花了几天时间来解决这个问题......我们得到了“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]");
}
现在已修复。将在 Net9 中提供。