2

我有一个提供打印功能和预览打印功能的应用程序。打印预览使用PrintPreviewDialog. 该应用程序是 C# WinForms .Net 4.0 应用程序。

本质上,该功能是打印(预览)一个多页报告,在这个特定的实例中,它正在预览大量的图像文件(大约 950 个,每页 2 个图像)。

在这种情况下,应用程序在第 462 页抛出错误(因此与总数相差不远),此时以下任务管理器值可用:

  • 内存 (PWS):~1.6GB
  • 手柄:~480
  • 用户对象:~300
  • GDI 对象:~1400

我确信内存(虽然很高)不是问题,因为我预计内存不足异常。GDI 对象有点上,但我不认为这太高(我相信默认限制是 10000?)

显示的实际异常消息非常有用:

GDI+ 中出现一般错误

其他一些需要警惕的事情:

  • 这是在客户站点上运行的应用程序,因此无法运行调试器
  • 图像首先作为Image对象集合加载到内存中(这解释了高 GDI 对象计数),并且在此阶段无法更改
  • 我还没有确认在进行真正的打印时这是否也是一个问题,显然没有人愿意浪费所有的纸张,但我正在等待打印到 PDF 测试的结果

最后,我的问题是:我应该注意哪些限制可能会导致这种行为?例如可能在注册表中设置的 Windows 限制。与打印内存有关的东西?或不同的 GDI 打印限制?

是否有任何进一步的测试可以帮助诊断原因?

4

1 回答 1

0

我不知道它是否有帮助,但可能不是系统限制的情况,而是文件锁定。

您提到您正在使用 Image 将文件加载到内存中。MSDN在这里说:

该文件保持锁定状态,直到图像被释放。

然后,如果您的程序试图触摸它,GDI+ 就会发疯。

将图像保存到磁盘时有时会出现错误,如下所示: Image.Save(..) throws a GDI+ exception because the memory stream is closed

也许尝试使用 FileShare.ReadWrite 选项将图像加载到 MemoryStream 中?

于 2013-07-09T14:19:59.773 回答