【问题标题】:Disposing unmanaged resources in a form在表单中处理非托管资源
【发布时间】:2016-08-06 10:27:43
【问题描述】:

我正在使用 Dispose 进行研发。我对处理图像资源的表单有疑问。

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 或包含在“使用”中。何时以及如何处置此资源。请指教。

【问题讨论】:

  • 我不认为你可以明确地做到这一点,但垃圾收集器会处理它。在 .NET 中,当对象超出范围时,它们被分配给 Gabage 收集器,这将自动释放它们的内存。
  • 只需添加一个 FormClosed 事件处理程序,调用 image1.Image.Dispose()。

标签: c# winforms


【解决方案1】:

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

.NET Bitmap 类“封装了一个 GDI+ 位图”,这意味着您应该在完成后调用位图上的 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);
}

【讨论】:

  • 注意;如果您不希望一次性物品是“全局的”和/或有多个一次性物品要处理,您可以使用“全局”IList<IDisposable> 并在Dispose 内循环释放它们
猜你喜欢
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多