C#CopyFromScreen填满内存

时间:2014-02-10 22:52:04

标签: c# .net memory screenshot

我正在使用此代码每秒使用计时器进行屏幕截图,但它似乎填满了我的记忆(每次约30 MB)...这是代码:

Bitmap bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
Graphics gfxScreenshot = Graphics.FromImage(bmpScreenshot);
gfxScreenshot.CopyFromScreen(136, 93, 9, 0, new Size(1088-391, 1039-65), CopyPixelOperation.SourceCopy);

return bmpScreenshot;

有没有办法清除记忆?

3 个答案:

答案 0 :(得分:1)

您需要通过调用Dispose或使用为您调用它的using()语句包装来正确处理事物,例如:

Bitmap bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);

using(Graphics gfxScreenshot = Graphics.FromImage(bmpScreenshot)) {
    gfxScreenshot.CopyFromScreen(136, 93, 9, 0, new Size(1088-391, 1039-65),   CopyPixelOperation.SourceCopy);
}

return bmpScreenshot;

一旦完成,您还应该处理返回的Bitmap实例。

答案 1 :(得分:0)

BitmapGraphics实现IDisposable接口。要释放非托管资源,您应该调用Dispose方法或使用using语句包装这两个对象。

答案 2 :(得分:0)

我也遇到了这个问题。

var g = CreateGraphics();

using (var brush = new SolidBrush(Color.Red))
{
    Point point = new Point(0,0);
    Rectangle sourceRect = new Rectangle(100,100,100,100);

    var invoker = new MethodInvoker(() =>
    {
        // The following line will filling up the memory.
        g.CopyFromScreen(new Point(0,0), sourceRect.Location, sourceRect.Size);
    });
    do
    {
        BeginInvoke(invoker);
    } while (!mre.WaitOne(1));
}

这意味着'CopyFromScreen'方法具有一些未处理的东西。 但是我不知道如何处置它们。 即使通过VS2017的“诊断工具”,我也可以看到堆的使用情况,并指向ExecutionContext-> Queue,队列变得越来越大,并且队列中每个项目的大小通常为44字节。当然,GC会在一段时间后收集它们,但它仍会迅速长大。