C# 调用Application.Exit()时由于集合修改而导致System.InvalidOperationException
我有一个非常,非常奇怪的错误,我一直无法确定(这种情况很少发生)。基本上,我有一个C#应用程序,它在退出时随机抛出一个未知异常。这次我设法在调试器中捕获了它,结果表明调用C# 调用Application.Exit()时由于集合修改而导致System.InvalidOperationException,c#,.net,invalidoperationexception,C#,.net,Invalidoperationexception,我有一个非常,非常奇怪的错误,我一直无法确定(这种情况很少发生)。基本上,我有一个C#应用程序,它在退出时随机抛出一个未知异常。这次我设法在调试器中捕获了它,结果表明调用Application.Exit()会抛出一个System.invalidoOperationException,并显示以下消息: mscorlib.dll中发生类型为“System.InvalidOperationException”的第一次意外异常 附加信息:集合已修改;枚举操作不能执行 我不确定这个据称被修改过的收藏是什么
Application.Exit()
会抛出一个System.invalidoOperationException
,并显示以下消息:
mscorlib.dll中发生类型为“System.InvalidOperationException”的第一次意外异常
附加信息:集合已修改;枚举操作不能执行
我不确定这个据称被修改过的收藏是什么,或者是谁修改了它
堆栈跟踪没有多大帮助:
mscorlib.dll!System.Collections.ArrayList.ArrayListEnumeratorSimple.MoveNext()
+0x13f字节系统.Windows.Forms.dll!System.Windows.Forms.Application.ExitInternal()
+0x112字节System.Windows.Forms.dll!System.Windows.Forms.Application.Exit(System.ComponentModel.CancelEventArgs
e) +0x65字节
你知道我怎样才能知道哪个ArrayList被修改了吗?我不认为我在做任何明确的事情,更可能的是我在操作过程中修改.NET framework的基本状态,这是MS没有预料到的。不同寻常,以前从未见过。方法的作用是迭代Application.OpenForms集合。显然,此集合正在进行修改。造成这种情况的可能原因很少,我只能提出一个。您的一个表单已重写OnFormClosing()方法或订阅FormClosing事件。并且正在做一些修改OpenForms集合的事情。可能是处理表单对象或创建新表单实例,或修改导致重新创建窗口的表单属性,如ShowInTaskbar
在调用堆栈中找不到此代码。查看您的On/FormClosing代码。如果您不能快速找到代码,请将其注释掉。我们也在这个问题上花了几天时间。。。我们从中得到了“System.invalidoOperationException”异常和应用程序(在本例中使用的是来自DynamSoft的twain库)。显然,我们不应该在调用application.exit之后调用CLOSE()。注释结束使异常消失,并使应用程序正常结束。从视觉上看,该应用程序会显示一个来自微软的奇怪消息框,上面写着“你想提交关于这个问题的更多信息吗”-什么问题?在此之前,它没有显示任何内容,所以我们开始挖掘堆栈痕迹
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]");
}
听起来像是表单集合。IIRC我以前见过这种情况,但不记得任何细节,抱歉。你的应用程序在关机时做什么?你能提供密码吗?没什么,真的。。。当我按下退出按钮时,应用程序处于空闲状态,没有后台线程或活动在运行。我有这个问题,因为我有一个表单是在初始线程以外的线程上创建的。检查每个表单的
FormClosing
和FormClosing
事件。在线程上运行的表单是否与主GUI不同?刚刚注意到“第一次机会异常”-您确定看到的是正确的异常吗?()我确实有一个相当复杂的表单关闭代码,有时会打开消息框。无论如何,从Application.Exit()更改为this.Close()似乎解决了这些问题,而无需我更改FormClosing的内容。@Hans Passant,有着完全相同的问题;果然,我在我的Form\u CLOSING
方法中显示了一个消息框。和吊杆,相同的收集修改。真傻。将其移动到表格_关闭
且状态良好。有点奇怪,但嘿,这个结果太棒了。这也正是我的问题,OnClosing中的MessageBox使应用程序无效。退出open forms迭代器。将其移动到OnClosed修复了它!