处理不被召唤

时间:2010-12-23 19:29:56

标签: c# .net idisposable

我在这里看到了一些关于如何在超出范围时处理对象的方法的帖子,但我尝试的任何东西似乎都没有用。

我有一个我创建的loadingscreen类,所以我在一个表单的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(),仍然有时候没有处理对象。

有什么建议吗?

3 个答案:

答案 0 :(得分:5)

首先,您无需明确调用loader.Dispose():这就是拥有using块(它会自动调用Dispose)背后的重点。

其次,你的意思是“对象没有被处理”,因为Dispose被调用(并且不可能不会被调用; using确保这一点。)

答案 1 :(得分:1)

无论如何只使用

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

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

答案 2 :(得分:0)

除了说IDisposable的答案和使用声明处理你的对象:

如果您正在观察任务管理器的内存占用情况,Dispose()将不会使分配的内存量缩小。一种常见的误解是,在分配和释放内存的确切时刻,应用程序内存占用量会缩小和扩展。事实并非如此。虽然分配大块内存可能会使占用空间立即增加,但释放不会那样。

如果您仍然确信资源没有被释放,您可以尝试destructor

  

然而,当你的申请   封装非托管资源   作为窗口,文件和网络   连接,你应该使用   析构者释放这些资源。   当对象符合条件时   破坏,垃圾收集器   运行Finalize方法   对象