我正在使用匿名方法來處理COM對象中的事件。一旦程序終止,看來我在匿名方法中使用的資源沒有被「正確關閉」,因爲我收到了我正在觀看的每個資源的第一次機會異常(InvalidComObjectException)。我想這不是什麼大不了的事情,但它並不覺得「正確」。如何釋放/處理/銷燬匿名方法中的捕獲變量?
我無法想象一種方法來訪問匿名方法範圍之外的那些捕獲的變量(無論如何你都不應該這樣做)。如何在退出申請前關閉/處理資源?
編輯:經過短暫的重讀,可能不清楚我在這裏做什麼。我正在編寫一個使用COM對象的託管應用程序。
更多編輯:我正在使用ArcGIS Engine來操作GIS數據。在這種特殊情況下,我在ILayerEvents_Event中使用VisibilityChanged事件來監視GIS圖層何時可見或不可見。該事件只傳遞一個布爾(可見或不可見)而不是圖層名稱,因此需要爲每個圖層創建一個方法來創建其可見性狀態更改。由於我正在處理動態圖層,因此我需要一種方式來動態執行此操作,因此需要使用匿名方法。
在anonymoua方法中,我有一個ILayer變量,它從外部循環(在ILayer上下文中)中獲取ILayerEvents_Event,以便我知道我正在使用哪個圖層。在這一點上,我卡住了。這些功能可以正常工作,一切都很好,直到我退出應用程序,這些20多個引用掛在那裏,沒有地方可去,而是發生異常。
我不知道用戶何時會最後一次隱藏/顯示一個圖層,因此無法在最後一步將它清空。我想我可以保持原樣(或者,也許有比匿名方法更好的方法),因爲它似乎不會傷害任何東西。我只是覺得我錯過了一些東西。
你知道,當你一直在做一些不停的事情並且最終突破它時,你會感覺到嗎?我在那裏。感謝大家的幫助(包括來自單獨發佈的Marc Gravell)。我最終不得不保留一個COM對象列表以及附加到它們事件的匿名方法,然後在關閉之前取消註冊這些委託。這使得事情沒有拋出異常。 – 2009-05-28 16:03:36