【问题标题】:Is there a limit when doing a Print Preview?进行打印预览时是否有限制?
【发布时间】:2013-07-09 13:51:44
【问题描述】:

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

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

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

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

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

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

GDI+ 中发生一般错误

还有一些需要注意的事情:

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

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

我可以进行进一步的测试来帮助诊断原因吗?

【问题讨论】:

    标签: c# winforms printing


    【解决方案1】:

    不知道有没有用,可能不是系统限制,而是文件锁。

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

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

    如果你的程序试图去触摸它,GDI+ 就会发疯。

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

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

    【讨论】:

    • 实际上,我不愿意认为这是原因,因为在我将文件加载到 MemoryStream 之后。然后我将它绘制到一个新图像上,并关闭 MemoryStream - 这应该消除与文件的任何连接。这可能是一个被锁定的初始读取,很难说,正如我现在所说的,我无法更改代码来测试它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 2018-06-04
    • 2011-01-15
    • 1970-01-01
    • 2010-10-09
    相关资源
    最近更新 更多