2011-10-27 63 views
8

上的集合修改而引起的這個真的很奇怪的錯誤,我從來沒有找到過(它很少發生)。基本上,我有一個C#應用程序,它在退出時隨機拋出一個未知的異常。我已經成功地抓住它在調試這個時候,而且事實證明,在調用Application.Exit()是扔一個System.InvalidOperationException以下消息:System.InvalidOperationException因調用Application.Exit()

「System.InvalidOperationException」類型的第一次機會異常出現在mscorlib中。 dll

其他信息:收集已修改;枚舉操作可能不會執行。

我不知道什麼收集已涉嫌修改爲,或者是誰是修改了它。

堆棧跟蹤是不是非常有幫助!

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框架的基礎狀態。

+0

聽起來像Forms集合。 IIRC我以前見過這種情況,但不記得任何細節,對不起。 – leppie

+1

你的應用程序在關機時做什麼?你能否提供代碼? – Fischermaen

+0

沒什麼,真的......當我按下退出按鈕時,應用程序處於空閒狀態,沒有後臺線程或活動正在運行。 –

回答

17

不尋常,之前從未見過。 Application.ExitInternal()方法迭代Application.OpenForms集合。顯然,這個集合正在進行修改。對此有幾個可能的原因,我只能拿出一個。其中一個表單已經重寫了OnFormClosing()方法或訂閱了FormClosing事件。並且正在做一些修改OpenForms集合的東西。可能是放置窗體對象或創建新的窗體實例或修改窗體屬性,導致窗口被重新創建,如ShowInTaskbar。

您不會在調用堆棧中找回此代碼。查看您的On/FormClosing代碼。如果無法快速找到,請留下注釋。

+0

我有一個相當複雜的FormClosing代碼,有時會打開消息框。無論如何,從Application.Exit()更改爲this.Close()似乎解決了這些問題,而無需更改FormClosing的內容。 –

+2

@Hans Passant,具有完全相同的問題;果然,我在Form_CLOSING方法中顯示了一個消息框。和繁榮,相同的收藏修改。多麼愚蠢。將它移動到'Form_CLOSED'並且很好。有點奇怪,但是,嘿,對這樣的結果喝彩。 – 2012-01-11 19:03:24

+1

這正是我的問題,OnClosing中的MessageBox使Application.Exit打開表單迭代器失效。將它移到OnClosed修復它! – Blindy

0

我們也在這個問題上花了幾天......我們得到了'System.InvalidOperationException'異常,並且應用程序(在這種情況下使用了來自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]"); 
      } 
相關問題