Печать из C# с использованием слишком большого количества ручек
У меня есть очень простое приложение, которое печатает файлы TIFF на различных сетевых принтерах. Все принтеры установлены на 3 разных серверах печати, а приложение работает на отдельном компьютере. (Позволяет называть их Print1,2,3 и App1.)
В большинстве случаев это работает хорошо, но в последнее время я заметил, что некоторые новые принтеры (модель HP P4515x с драйверами PCL6) вызывают скачок в количестве ручек, открываемых spoolsv.exe в App1. Один документ может поднять дескрипторы на 500, и они никогда не освобождаются, что в конечном итоге приводит к необходимости перезагрузки компьютера App1, если это не происходит вовремя. Ни один из реальных серверов печати, похоже, не подвержен этой проблеме.
Код делает что-то очень похожее по концепции с этим, но из фоновой службы, работающей под учетной записью домена: MSDN Link. Я указываю принтер, используя соглашение об именовании \print3\deptP4515x.
[Не уверен, если это происходит на StackOverflow или ServerFault, но я думаю, что из-за возможной проблемы с драйвером, это должно быть здесь?]
РЕДАКТИРОВАТЬ: я запустил procxp и вижу, что из 1243 дескриптор он вырос, 1135 это: Ключ HKLM\ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \Hewlett-Packard\San Diego Shared IO
3 ответа
Попробуйте воспроизвести симптом с помощью другого драйвера, например, HP LaserJet 4 или 4100 PCL. Используйте встроенный драйвер, а не пользовательский драйвер, поставляемый поставщиком.
Если проблема возникает с этими драйверами, это, вероятно, не проблема с драйвером P4515.
Запустите поиск в папке%systemroot%\system32\spool\drivers, выполнив поиск hpbmini.dll и hpcdmc32.dll. Известно, что более старые версии этих файлов вызывают серьезные проблемы при печати.
Вы являетесь Dispose()- вы используете объекты PrintDocument? Это частое упущение в примерах MS .NET.
Проверьте код приложения. Убедитесь, что подключения принтера созданы внутри using
заявления. В противном случае управляемый код не гарантирует их своевременное закрытие, и скорость его выпуска действительно может зависеть от характера драйвера принтера (то есть принтеры разных моделей могут быть признаком этой более глубокой проблемы).