簡體   English   中英

System.InvalidOperationException由於在調用Application.Exit()時進行了集合修改

[英]System.InvalidOperationException due to collection modification on call to Application.Exit()

我遇到了一個我從未能夠確定的非常非常奇怪的錯誤(這種情況很少發生)。 基本上,我有一個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()。 注釋掉關閉會使異常消失,並使應用正常結束。 從外觀上看,該應用程序將顯示來自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]");
            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM