【发布时间】:2017-05-08 16:49:31
【问题描述】:
我目前正在将网络摄像头功能实现到我正在创建的应用程序中,但是我遇到了一些内存使用问题。
我的功能如下图
这是第一个实现
private void webcam_newFrame(object sender, NewFrameEventArgs eventArgs) {
if (!_pause) {
var img = (Bitmap) eventArgs.Frame.Clone();
pbPicture.BackgroundImage = img;
}
}
但是,这段代码导致了巨大的内存泄漏,运行了 2gb(我假设是 ram)。由于内存不足而崩溃之前。 然后我更改了代码以处理位图,就像这样
private void webcam_newFrame(object sender, NewFrameEventArgs eventArgs) {
if (!_pause) {
var img = (Bitmap) eventArgs.Frame.Clone();
pbPicture.BackgroundImage = img;
img.Dispose(); // This causes exception
}
}
这会导致在 System.Drawing.dll 中引发异常:“System.ArgumentException”。
附加信息:参数无效。
在以下调用此表单的代码上:
WebcamForm wForm = new WebcamForm();
wForm.ShowDialog();
于是我把函数改成了这样:
private void webcam_newFrame(object sender, NewFrameEventArgs eventArgs) {
if (!_pause) {
pbPicture.BackgroundImage = (Bitmap)eventArgs.Frame.Clone();
GC.Collect();
}
}
此代码正常运行,内存使用量保持在 360mb 左右,这是一致的,考虑到应用程序,这是一个合理的数字。
我的问题是,在每一帧上强制进行垃圾收集是一个很好的解决方案吗?有没有潜在的问题?
我确信过去我已经看到强制垃圾收集是一件坏事的答案,但是我想不出任何替代方法来解决这个问题。
干杯
【问题讨论】:
标签: c# memory bitmap garbage-collection