【问题标题】:Random System.ArgumentException after a certain time while taking screenshots截屏一段时间后出现随机 System.ArgumentException
【发布时间】:2013-01-10 16:43:59
【问题描述】:

我的应用程序可以正常运行大约 5 分钟,然后它会抛出一些随机的 System.ArgumentException,如下面的屏幕截图所示: 这里最大的问题是这两个论点实际上似乎都是正确的,并且在大约 5 分钟内可以正常工作。 我的应用程序只是在单独的线程中不断拍摄屏幕快照。

下面的代码截取屏幕截图,在这个sn-p中产生了System.ArgumentException(和截图一样)。

Bitmap SNew = new Bitmap(NewRes.Width, NewRes.Height);
using (Graphics g = Graphics.FromImage(SNew))
    g.CopyFromScreen(0, 0, 0, 0, new Size(NewRes.Width, NewRes.Height));

同样的异常也可能出现在CopyFromScreen 方法中,具有相同的看似正确的NewRes 值(虽然没有出现在我的sn-p 的第一行):

An unhandled exception of type 'System.ArgumentException' occurred in System.Drawing.dll


如果我将此代码放在try { } catch { } 子句中,它也可以正常工作(异常在日志中弹出大约 10 次后不再发生异常)。这当然不是一个很好的解决方案,有时它只是永远挂在那个异常中,在我重新启动应用程序之前根本不截屏。

我不知道为什么这些参数无效以及可能导致这种情况的原因。有什么想法吗?

【问题讨论】:

  • 当你完成后你是否在你的位图上调用 Dispose(以及任何其他对它的引用)?
  • 这确实“修复”了问题的一部分,现在我在通过 CopyFromScreen 的较长时间后内存不足。

标签: c# exception argumentexception


【解决方案1】:

我可以肯定地向您提供的是一个具体的替代方案,它将产生相同的输出,但不是使用CopyFromScreen 而是使用platform invoke 直接与 Windows API 进行互操作。你可以在这里找到一个完整的例子,Hans Passant 作为对here 问题的回应。

但是,我不能肯定地告诉你为什么你会遇到异常,但我可以从其他来源推断,例如 this thread(顺便将 Hans 再次作为 nobugz)和我自己的经验,CopyFromScreen 是越野车,在这种情况下,可能会遭受内存泄漏。考虑到我链接的线程,您的目标框架是哪个版本的 .NET Framework?

【讨论】:

  • 我正在使用 .NET 3.5,根据链接的主题,这似乎会导致此类问题。我现在正在测试您提供的替代方案。
  • 连同一个被遗忘的 Dispose/using 在 Bitmap 对象上,这已成功修复它。它现在连续运行了 3 个小时。
猜你喜欢
  • 1970-01-01
  • 2017-10-03
  • 1970-01-01
  • 1970-01-01
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多