正在处置窗体中的非托管资源

本文关键字:资源 窗体 | 更新日期: 2023-09-27 18:01:10

我正在做R&D和Dispose。我对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。出于显而易见的原因,在"using"中进行处置或封闭。何时以及如何处置此资源。请告知。

正在处置窗体中的非托管资源

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

NET位图类";封装GDI+位图";,这意味着您应该在完成位图后调用Dispose

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

您可以简单地通过重写Dispose方法来实现这一点
但是,WinForms的问题是,您的窗体是一个分部类,并且有一个部分YourForm.Designer.cs,它是由Visual Studio自动生成的,并且已经实现了用于处理WinForms组件的Dispose方法
您需要将此方法移动到您的代码中,请阅读此SO问题中的更多内容。

然后,您的方法将看起来像:

protected override void Dispose(bool disposing)
{
  if (disposing)
  {
    if (components != null)
    {
      components.Dispose();
    }
    mimg.Dispose(); // mimg should be global, of course
  }
  base.Dispose(disposing);
}