我正在使用此代码每秒使用计时器进行屏幕截图,但它似乎填满了我的记忆(每次约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;
有没有办法清除记忆?
答案 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)
Bitmap
和Graphics
实现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会在一段时间后收集它们,但它仍会迅速长大。