我刚刚意识到,通过阅读StackOverflow上的一些问题和答案,+=在C#(或者我猜,其他.net语言)中添加事件处理程序会导致常见的内存泄漏......
我过去曾多次使用这样的事件处理程序,并且从未意识到它们可能导致或导致我的应用程序中的内存泄漏.
这是如何工作的(意思是,为什么这实际上会导致内存泄漏)?
我该如何解决这个问题?是否-=足够使用相同的事件处理程序?
是否有常见的设计模式或最佳实践来处理这样的情况?
示例:我应该如何处理具有许多不同线程的应用程序,使用许多不同的事件处理程序在UI上引发多个事件?
是否有任何好的和简单的方法可以在已经构建的大型应用程序中有效地监控它?
我用C#创建了一个程序.该程序使用了大约60-70 MB的内存.但是当我最小化该程序时,它需要更少的内存,即只需10 MB.
当我最大化或回到该程序时它使用了20 MB ......
为什么会这样?
当你最小化程序时,垃圾收集器是否被调用?
虽然我已经编程了大约11年(主要是VB6,过去6个月C#),但它是第一次真正提出问题:)我已经找到了我的所有答案来自teh interwebz但是这个问题我无法解决自己.您的网站是最有帮助的地方之一,我得到了最好的答案!
我将展示我正在使用的代码(相关内容的摘录).问题是当使用RotateFlip方法时,内存会迅速增加到~200M,然后在一段时间后由GC收集.调用它的主要方法每秒迭代大约30次,因此这里的性能至关重要.我尝试使用图形矩阵变换,但这有时会失败并显示非翻转图像.应用程序本身基于使用网络摄像头,隐藏预览,获取回调图片并在图片框中显示.然后它覆盖了另一个类上的矩形.这是使用回调而不是预览窗口的原因.
Capture.cs类:
internal Bitmap LiveImage;
int ISampleGrabberCB.BufferCB(double bufferSize, IntPtr pBuffer, int bufferLen)
{
LiveImage = new Bitmap(_width, _height, _stride, PixelFormat.Format24bppRgb, pBuffer);
if (ExpImg) // local bool, used rarely when the picture saving is triggered
{
LiveImage.RotateFlip(RotateFlipType.RotateNoneFlipY);
var a = LiveImage.Clone(new Rectangle(Currect.Left, Currect.Top, Currect.Width, Currect.Height),
LiveImage.PixelFormat);
using (a)
a.Save("ocr.bmp", ImageFormat.Bmp);
}
else // dmnit, rotateflip leaks like h*ll but matrix transform doesn't sometimes flip :S
{
LiveImage.RotateFlip(RotateFlipType.RotateNoneFlipY);
/*using (var g = Graphics.FromImage(LiveImage))
{
g.Transform = _mtx;
g.DrawImage(LiveImage, 0, 0); …Run Code Online (Sandbox Code Playgroud)