安全與非託管手柄
工作可靠釋放非託管手柄而不約束的執行區域(的CER)是不可能的。由於ThreadAbort
或OutOfMemory
例外可能會出現在您的終結器中,您總是會遇到競爭狀況。所以你需要使用CERs。
CriticalFinalizerObject
在內部使用約束執行區域,在最終化過程中優先化,還有一些其他功能使得它「相對容易」相對容易,並且在需要時總是釋放非託管資源。一般情況下,你應該從SafeHandle
或CriticalFinalizerObject
派生手柄握住非託管對象。這樣你就知道當物體被垃圾收集時它們會被清理乾淨,即使它是一種不尋常的關機情況,如ThreadAbortException
。
使用什麼()和IDisposable的增加
using()
和IDisposable模式讓你急切地釋放非託管資源 - 如您使用的是他們做盡快。如果你不用using()
來處理你的對象,他們會堅持到下一次垃圾收集。這是低效率的。
所以CriticalFinalizerObject
是關於如何確保非託管資源最終釋放而using()
是關於如何確保非託管資源被迅速釋放。兩者應該一起使用。
另外using()
適用於純粹的託管代碼,例如,如果您正在緩存一個對象池,則Dispose()
可以將對象返回到池中。
GC
壓實堆可以更有效,因爲持續時間長的對象最終都擠在一起時壓實堆。在.NET Framework中,只有最低的一代(最近創建的對象)被嚴格壓縮。 Theres在引擎蓋下進行了很多優化。閱讀起來很有趣,但對於完成工作並不重要。如果您想了解更多信息,請搜索關於「世代垃圾收集」的文章。
感謝所有的意見。傾聽來自你們的想法,幫助很多!謝謝!! :) – 2009-11-09 05:26:26