1

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

以下代码截取屏幕快照,并System.ArgumentException在此片段中引起 a (与屏幕截图相同)。

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值(虽然没有出现在我的代码片段的第一行):

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


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

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

4

1 回答 1

1

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

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

于 2013-01-10T16:59:44.933 回答