в программе камера должна отображать всё происходящее в режиме онлайн без записи информации, для этого использую библиотеки AForge.Video и AForge.Video.DirectShow от Aforge.net. При просмотре диспетчера задач заметил, что при включенной камере приложение начинает есть память до определённого момента(так понимаю, накапливаются снимки с потока), потом память сбрасывается, видимо CLR, затем опять всё по новой. А теперь вопрос: как подчищать накопленную информацию с потока самостоятельно без помощи CLR? Пример кода:
private FilterInfoCollection videoDevices = null;
private VideoCaptureDevice videoSource = null;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);
videoSource.NewFrame += new NewFrameEventHandler(videoSource_NewFrame);
videoSource.Start();
}
void videoSource_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
this.pictureBox1.Image = (Image)eventArgs.Frame.Clone();
}
Выделение памяти в управляемых платформах дёшево, очистка – дорога. Поэтому пока свободная память есть, она потребляется. Как её станет мало, просыпается сборщик мусора и очищает её. Поэтому то, что вы видите в диспетчере задач – нормальное поведение.
Вообще, не стоит вмешиваться в работу системы управления памятью (сборщика мусора) в .NET. Однако, если очень хочется, то можно вызывать метод GC.Collect
.
Кроме потребления памяти (которой много), более остро стоит вопрос потребления неуправляемых ресурсов (которых мало), таких как хендлы. Стоит позаботиться о своевременном их освобождении.
В вашем коде это может выглядеть примерно так:
void videoSource_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
//if (pictureBox1.Image != null)
pictureBox1.Image.Dispose();
this.pictureBox1.Image = (Image)eventArgs.Frame.Clone();
}
Особо отмечу, что вызов Dispose
в общем случае не освобождает память, он освобождает ресурсы (хендлы)!
P. S. Исходное изображение Frame
тоже нужно диспозить. Так как оно клонируется, я предполагаю, что оно используется где-то ещё. После окончания использования вызывайте Dispose
. А может, клонирование и не нужно?
У меня есть меню, которое я беру из базы данных и отображаю его на странице, при выборе одного из пунктов меню, мне нужно подгрузить информацию...
Изучаю еще только WPF, есть сложности в понимании привязки данных к отображению
Привет всем! В C# есть const и readonlyВ сети нашел только информацию о разнице static readonly и const