使用过多句柄从 C# 进行打印

使用过多句柄从 C# 进行打印

我有一个非常简单的应用程序,它可以将 TIFF 文件打印到各种联网打印机上。这些打印机都安装在 3 个不同的打印服务器上,而应用程序则在单独的机器上运行。(我们将它们称为 Print1、2、3 和 App1。)

大多数情况下,这种方法效果很好,但最近我注意到,某些新打印机(使用 PCL6 驱动程序的 HP P4515x 型号)导致 App1 上的 spoolsv.exe 打开的句柄数量激增。一个文档可以将句柄数量增加 500 个,并且这些句柄永远不会被释放,如果不能及时发现,最终会导致 App1 计算机必须重新启动。实际的打印服务器似乎都没有受到此问题的影响。

该代码在概念上与此非常相似,但是是从域帐户下运行的后台服务执行的:MSDN 链接。我使用 \print3\deptP4515x 命名约定指定打印机。

[不确定这是否会出现在 StackOverflow 或 ServerFault 上,但我认为由于可能存在驱动程序问题,它应该出现在这里?]

编辑:我运行了 procexp 并看到它已经增长到 1243 个句柄,其中 1135 个是:键 HKLM\SOFTWARE\Hewlett-Packard\San Diego Shared IO

答案1

尝试使用其他驱动程序(如 HP LaserJet 4 或 4100 PCL)重现该症状。使用内置驱动程序,而不是供应商提供的自定义驱动程序。

如果这些驱动程序出现该症状,则可能不是 P4515 驱动程序的问题。

在 %systemroot%\system32\spool\drivers 文件夹中运行查找,搜索 hpbmini.dll 和 hpcdmc32.dll。已知这些文件的旧版本会导致打印出现严重问题。

答案2

您正在 Dispose() 您的 PrintDocument 对象,对吗?这是 MS .NET 示例中经常遗漏的一个内容。

答案3

检查应用程序代码。确保在using语句内创建打印机连接。否则,托管代码不能保证及时关闭它们,而发布的速度实际上可能取决于打印机驱动程序的性质(这意味着不同型号的打印机可能是这个更深层次问题的症状)。

相关内容