2010-12-23 61 views
1

我在這裏看到了一些關於在超出範圍時處理對象的方法,但我沒有嘗試過似乎有效的方法。配置不被稱爲

我有一個我創建的加載畫面類,所以我聲明瞭窗體的xxx_load函數中的對象。我希望對象在超出範圍時自動放置,以便自動處理加載屏幕的隱藏。

這裏是我的類加載

public class Loader : IDisposable 
{ 
    public Loader() 
    { 
     Form.Loadscreen(); 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
    } 

    protected virtual void Dispose(bool disposing) 
    { 
     Form.UnloadScreen(); 
    } 
} 

這裏是我如何在我的代碼中使用它。

using (Loader loader = new Loader()) 
{ 
    //... do some loading processing 

    loader.Dispose(); 
} 

即使我可以驗證loader.Dispose()被調用,仍然有時間對象不被處置。

有什麼建議嗎?

+4

如果看到Dispose()方法被調用,是什麼讓你認爲該對象沒有被處置? – NotMe 2010-12-23 19:35:33

回答

0

反正只使用

using (Loader loader = new Loader()) 
{ 
    //... do some loading processing  

} // loader.Dispose(); will be called automatically. That's IDisposable() for! 
+0

它最終成爲一個線程問題,一旦線程問題得到解決,「使用」方法就可以很好地工作。 – mvcNewbie 2011-01-19 22:24:32

+0

@ user518043:很高興幫助! :) – abatishchev 2011-01-20 07:44:27

5

首先,你不需要調用loader.Dispose()明確:這是有using塊(它調用Dispose自動)背後的整點。

第二,你是什麼意思「物體沒有被處置」,因爲Dispose被調用(並且沒有辦法調用它; using確保)。

如果你正在看任務管理器的內存佔用,Dispose()不會使分配的內存量縮:

0
從說了IDisposable和using語句照顧你的配置對象的答案

除了。這是一個常見的誤解,即應用程序內存佔用空間在內存分配和釋放時恰好收縮和擴展。這是不正確的。儘管分配大量內存可能會使佔用空間立即增加,但釋放不會以這種方式工作。

如果您仍然相信資源不會被放棄,您可以嘗試destructor

然而,當你的應用程序 封裝非託管資源, 窗戶,文件和網絡連接 ,你應該使用 析構函數來釋放這些資源。 當對象有資格銷燬 時,垃圾收集器 將運行 對象的Finalize方法。