С тех пор нет никакого искусственного предела, это действительно зависит от того, что понятно. Если у Вас есть набор довольно коротких, простых классов, которые логически группируются, бросают в наборе их. Если у Вас есть большие, сложные классы или классы, которые не имеют смысла как группы, пойдите один файл в классе. Или выберите что-то промежуточное. Осуществите рефакторинг, когда вещи изменяются.
Изображение
реализует IDisposable
, поэтому вы должны вызывать Dispose
для каждого создаваемого экземпляра Image
, когда он больше не нужен. Вы можете попробовать заменить эту строку в своем коде:
pic.Image = System.Drawing.Image.FromHbitmap(bmp.GetHbitmap());
На это:
if (pic.Image != null)
{
pic.Image.Dispose();
}
pic.Image = System.Drawing.Image.FromHbitmap(bmp.GetHbitmap());
Это удалит предыдущее изображение (если оно есть) до того, как будет назначено новое.
Дело в том, что вы создаете растровое изображение GDI bmp
с GetHbitmap, который согласно msdn:
Вы несете ответственность за вызов GDI DeleteObject, чтобы освободить память, используемая объектом растрового изображения GDI.
Затем метод FromHbitmap делает копию растрового изображения GDI; так что вы можете освободить входящее растровое изображение GDI с помощью метода GDI DeleteObject сразу после создания нового изображения.
В общем, я бы добавил:
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);
...
IntPtr gdiBitmap = bmp.GetHbitmap();
// Release the copied GDI bitmap
if (pic.Image != null)
{
pic.Image.Dispose();
}
pic.Image = System.Drawing.Image.FromHbitmap(gdiBitmap);
// Release the current GDI bitmap
DeleteObject(gdiBitmap);
Я не уверен, нужно ли вам растровое изображение GDI для выполнения какого-либо преобразования. Если вы этого не сделаете, вы можете просто назначить растровое изображение свойству Image вашего PictureBox и проигнорировать первое решение:
// Since we're not using unmanaged resources anymore, explicitly disposing
// the Image only results in more immediate garbage collection, there wouldn't
// actually be a memory leak if you forget to dispose.
if (pic.Image != null)
{
pic.Image.Dispose();
}
pic.Image = bmp;