我有一个非常简单的应用程序,可以将 TIFF 文件打印到各种联网打印机。打印机都安装在 3 台不同的打印服务器上,而应用程序则在单独的机器上运行。(我们称它们为 Print1、2、3 和 App1。)
大多数情况下它运行良好,但最近我注意到某些新打印机(使用 PCL6 驱动程序的 HP P4515x 型号)导致 App1 上 spoolsv.exe 打开的句柄数量激增。一个文档可以将句柄提高 500,并且它们永远不会被释放,如果没有及时发现,最终会导致 App1 机器必须重新启动。实际的打印服务器似乎都不受此问题的影响。
该代码在概念上与此非常相似,但来自在域帐户下运行的后台服务:MSDN Link。我使用 \print3\deptP4515x 命名约定指定打印机。
[不确定这是否发生在 StackOverflow 或 ServerFault 上,但我认为由于可能的驱动程序问题,它应该在这里?]
编辑:我运行 procexp 并看到它已经增长到的 1243 句柄,1135 是这样的: Key HKLM\SOFTWARE\Hewlett-Packard\San Diego Shared IO
尝试使用其他驱动程序重现该症状,例如 HP LaserJet 4 或 4100 PCL。使用内置驱动程序,而不是供应商提供的自定义驱动程序。
如果这些驱动程序出现此症状,则可能不是 P4515 驱动程序的问题。
在 %systemroot%\system32\spool\drivers 文件夹中运行查找,搜索 hpbmini.dll 和 hpcdmc32.dll。已知这些文件的旧版本会导致打印出现重大问题。
你是你的 PrintDocument 对象的 Dispose()-ing 是吗?这是 MS .NET 示例中经常遗漏的地方。
检查应用程序代码。
using
确保在语句内部创建打印机连接。否则托管代码不能保证及时关闭它们,并且发布的速度实际上可能取决于打印机驱动程序的性质(这意味着不同型号的打印机可能是这个更深层次问题的症状)。