我強迫GC做一個清理
如果MEF仍具有對對象的引用,那麼顯然這並沒有做任何事情。如果對象已經變成垃圾,那麼垃圾收集器會自動收集它們 - 要求它這樣做顯然只是一個可能被忽略的提示。無論哪種方式,這都沒有必要。
我把一個日誌記錄機制放在析構函數中進行跟蹤,只有在關閉應用程序後才銷燬對象。我可以假設MEF已經創建了這些對象的其他引用嗎?
MEF將持有對創建對象的引用,以便在您要求導出時能夠重複返回相同的引用。要讓MEF放棄這些參考資料,您應該致電CompositionContainer.Dispose
。顯然你不能再使用容器了,儘管你可以創建一個新容器。
MEF也是其創建的任何IDisposable
對象的所有者。這意味着當您處理容器時,在放棄參考之前,它將調用Dispose
任何此類對象。
最好依靠致電Dispose
來執行清理,而不是使用終結器。 There is no guarantee that finalizers are run at all。
編輯:
我需要使用後銷燬的對象。但我不想破壞容器。我希望MEF作爲創建詢問部件的新實例的工廠,並且調用者應該能夠在不再需要時摧毀對象。你能幫忙嗎?
這是ExportFactory的用途。 (它以前被稱爲PartCreator
)。不幸的是,除非你使用Silverlight,否則它還不能在.NET 4中使用。您可以使用codeplex的預覽版本試用。
如果你不想使用MEF的預覽版中,你也許能夠通過創建工廠類,包裝容器,並利用其GetExport
和ReleaseExport
方法來獲取和釋放,實現諸如ExportFactory
自己的東西對象。如果您需要創建同一零件的多個實例,請不要忘記設置PartCreationPolicy
。
編輯2: 我不知何故錯過了你已經在使用ExportFactory
一直。當你完成對象時,你只需要調用ExportLifeTimeContext.Dispose
!
我需要在使用它之後銷燬對象。但我不想破壞容器。我希望MEF作爲創建詢問部件的新實例的工廠,並且調用者應該能夠在不再需要時摧毀對象。你能幫忙嗎? – Xaqron 2010-12-06 17:07:17