2010-12-23 63 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方法。