解決點擊關閉按鈕,應用程序退出時,系統爆出“集合已修改,可能無法執行枚舉操作”異常的相關思路


     這兩天在優化升級公司的一個業務系統時,更改了一下窗體關閉事件中的一句代碼,由system.Enviromen.Exit(0)改為了Application.Exit();但是這時候問題就出現了,當點擊系統右上角關閉按鈕的時候,會爆出“集合已修改,可能無法執行枚舉操作”的異常。如下圖所示:
     這是什么原因造成的呢?問了一下度娘,出現“集合已修改,可能無法執行枚舉操作”這種異常大部分都是因為誤用foreach語句引起的,foreach是取只讀的,在取的時候數據不能變(包括修改,刪除,添加等)。要避免這個問題,就應該使用for循環。以前沒有考慮過對collection類型對象操作時for 和foreach的區別,總感覺foreach更方便一些。於是寫了個foreach循環來驗證一下這種說法,用foreach來遍歷一個list,之后在foreach體內又對其添加,表面上邏輯和寫法看着沒錯,但在運行時確實了出現異常。
 
      仔細排查了一下相關程序,沒有發現哪使用了foreach,但是這種問題還是一直在出現。不過,在重現的過程中,發現了一個細節,就是”確定要離開系統嗎?“的提示框會出現兩次,點擊關閉按鈕之后,會彈出提示框,點擊確定按鈕,后會再次,彈出提示,再次點擊確定按鈕后,就爆異常了。發現這個細節后,突然意識到,這個異常的產生可能跟,彈出兩次對話框有關系。正常情況下,應該彈出一次。
      現在問題的焦點是為什么會觸發兩次確認對話框呢?應該跟Application.Exit()這句代碼有關系。Application.Exit()在MSDN上給出的含義是:停止在所有線程上運行的所有信息循環,並關閉應用程序的所有窗口。
     這下明白了,意思就是說:當執行Application.Exit();的時候會再次觸發窗體關閉事件,也就是formclosing事件,從而引發死循環。
     認識到問題所在后,調整了一下寫法:
     即把Application.Exit();放在formClosed事件里。在主窗體關閉后,再執行程序退出。
     再次,編譯系統后,點擊關閉按鈕,系統正常退出。至此,問題得到了完美解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM