在表单中处置非托管资源

时间:2016-08-06 10:27:44

标签: c# winforms

我正在使用Dispose进行R& D。如果Forms处理图像资源,我有一个疑问。

namespace DisposeTry
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Image mimg = new Bitmap("repository.png"))
            image1.Image = mimg;
        }
    }
}

我不能使用mimg.Dispose或封装在'中使用'原因很明显。何时以及如何处置此资源。请指教。

1 个答案:

答案 0 :(得分:4)

是的,你是对的,你需要手动处理Bitmap对象。

  

.NET Bitmap类“封装了一个GDI +位图”,这意味着你应该在完成它时调用Bitmap上的Dispose,

     

在释放对图像的最后一个引用之前,请始终调用Dispose。否则,在垃圾收集器调用Image对象的Finalize方法之前,不会释放它正在使用的资源。

您可以通过覆盖Dispose方法来执行此操作 但是,WinForms的问题在于您的表单是一个部分类,并且有一个部分YourForm.Designer.cs,它由Visual Studio自动生成,并且已经实现了Dispose方法来处理WinForms组件。
您需要将此方法移至代码中,请在this SO question中阅读更多内容。

然后,您的方法将如下所示:

protected override void Dispose(bool disposing)
{
  if (disposing)
  {
    if (components != null)
    {
      components.Dispose();
    }

    mimg.Dispose(); // mimg should be global, of course
  }

  base.Dispose(disposing);
}