如果我不调用dispose()会发生什么?

时间:2015-09-04 11:43:02

标签: c# bitmap dispose

public static void main(String[] args) throws SQLException, Exception {
    Connection con = ConnectionDefinition.getOracleConnection();
    CallableStatement cl = con.prepareCall("declare " +
                                            " a TVarcharArray;" +
                                            " begin " +
                                            "  a := TVarcharArray('A','B','C');" +
                                            "  ? := a;" +
                                            " end;\n" +
                                            "");
    cl.registerOutParameter(1, Types.ARRAY,"TVARCHARARRAY");
    cl.execute();
    String[] objArr = (String[]) (cl.getArray(1)).getArray();
    for(String tmp: objArr){
        System.err.println(tmp);
    }
    con.close();

}

我正在使用此代码捕获计算机的屏幕。

但今天我发现有一个名为Bitmap.Dispose()的方法。

调用Dispose()之间的区别是什么?代码运行至关重要吗?

4 个答案:

答案 0 :(得分:9)

如果某个类型实现了IDisposable接口,那么一定要调用Dispose方法(显式或using块)。

  

如果我不打电话处理(),会怎样?

如果你不这样做,析构函数(终结者)负责释放资源;但是,它有一些缺点:

  • 不确定:终结器由GC在专用线程上执行。 GC决定何时运行它们。如果对象保留了引用(例如,在主应用程序窗口中),则在退出应用程序之前可能不会执行终结器。
  • 开销:除非终结器被抑制,否则GC会对要销毁的物品进行一些处理。
  • 危险:如果终结者抛出异常,则会被视为致命,并会导致整个申请崩溃。

答案 1 :(得分:2)

必须致电Dispose。如果你不这样做,就会有一些非管理资源,比如GDI对象,不会被清理干净。这意味着你将会发生内存泄漏。

是的,请拨打Dispose(或者更好,使用using (...) { ... })。

答案 2 :(得分:0)

基本上你的代码应该是这样的

public void screenShot(string path)
{
    using (var bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
                                    Screen.PrimaryScreen.Bounds.Height,
                                    PixelFormat.Format32bppArgb))

    {
        var gfxScreenshot = Graphics.FromImage(bmpScreenshot);
        gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X,
                                Screen.PrimaryScreen.Bounds.Y,
                                0,
                                0,
                                Screen.PrimaryScreen.Bounds.Size,
                                CopyPixelOperation.SourceCopy);

        bmpScreenshot.Save(path, ImageFormat.Png);
    }
}

这可确保正确释放位图对象使用的非托管资源。如果没有正确处理,只需一个位图就不会遇到麻烦,但一旦开始批量处理,它就变得至关重要。不正确处理将导致内存不足问题,我发现内存填充速度非常快,编码不当。

答案 3 :(得分:0)

“Dispose”方法来自“IDisposable”界面并执行以下操作:

执行与释放,释放或重置非托管资源相关的应用程序定义任务。

基本上,您可以说使用的资源不会立即释放。即使不再需要它们也不行。 但只有当垃圾收集器释放它们时。

有关更多信息,请查看MSDN: IDisposable Interface

关于此主题的其他有用链接: