2016-08-06 3 views
2

Я делаю R & D с 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 или заключить в «использование» по понятным причинам. Когда и как распоряжаться этим ресурсом. пожалуйста, порекомендуйте.

+0

Я не думаю, что вы можете сделать это в явном виде, но сборщик мусора будет заботиться о нем. В .NET, когда объекты выходят из сферы действия, они назначаются на сборщик Gabage, который автоматически освобождает память. – null

+1

Просто добавьте обработчик события FormClosed, вызовите image1.Image.Dispose(). –

ответ

4

Да, вы правы, вам необходимо утилизировать объект Bitmap вручную.

В .NET класс Bitmap «инкапсулирует GDI + растровое изображение», это означает, что вы должны вызвать Dispose на Bitmap, когда вы закончите с этим,

Всегда вызывать Dispose, прежде чем выпустить свою последнюю ссылку на изображения , В противном случае ресурсы, которые он использует, не будут освобождены до тех пор, пока сборщик мусора не вызовет метод Finalize объекта Image.

Вы можете просто сделать это, переопределив метод Dispose.
Однако проблема с WinForms заключается в том, что ваша форма является частичным классом, и есть часть YourForm.Designer.cs, которая автоматически генерируется Visual Studio и уже реализует метод для удаления компонентов WinForms Dispose.
Вам необходимо переместить этот метод в свой код, читайте больше в 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); 
} 
+0

Примечание; если вы не хотите, чтобы одноразовый элемент был «глобальным» и/или имел несколько одноразовых для обработки, вы можете использовать «глобальный» 'IList ' и выпускать их в цикле внутри' Dispose' – Sehnsucht

Смежные вопросы