从C#打印使用太多的句柄

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

大多数情况下,这种方法运行良好,但最近我发现某些新的打印机(使用PCL6驱动程序的HP P4515x型号)正在导致App1上spoolsv.exe打开的句柄数量激增。 一个文件可以将手柄提高500,并且它们不会被释放,最终导致App1机器不能及时被重新启动。 实际的打印服务器似乎没有受到这个问题的影响。

代码在概念上做了一些非常相似的事情,但是从后台服务运行在一个域帐户: MSDN链接 。 我使用\ print3 \ deptP4515x命名约定来指定打印机。

[不知道这是否在StackOverflow或ServerFault上,但我认为由于可能的驱动程序问题,它应该在这里?]

编辑:我运行procexp,看看它已经发展到1243年,1135是这样的:关键HKLM \ SOFTWARE \惠普\圣地亚哥共享IO

尝试使用另一个驱动程序(如HP LaserJet 4或4100 PCL)再现症状。 使用内置的驱动程序,而不是由供应商提供的自定义驱动程序。

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

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

你的Dispose()是你的PrintDocument对象吗? 这是MS .NET例子的一个频繁的遗漏。

检查应用程序代码。 确保打印机连接是在using语句内部创build的。 否则托pipe代码不能保证及时closures它们,释放的速度可能取决于打印机驱动程序的性质(也就是说,不同型号的打印机可能是此深层问题的症状)。