.NET 4.5 PrintServer默认构造函数随机抛出Win32错误问题咨询
问题根本原因
该偶发异常确实和系统启动后打印服务未就绪直接相关。Windows默认将Print Spooler(打印后台处理服务)配置为延迟启动模式,刚完成系统重启的阶段,该服务还未完成初始化,此时调用PrintServer无参构造函数访问本地打印服务器资源,就会触发这类未在官方文档中标注的底层Win32异常。
解决方案
- 补充异常捕获范围:原有代码仅捕获了
PrintQueueException,需要额外捕获PrintServer构造过程中可能抛出的Win32Exception、PrintServerException类型异常,统一归类为设备暂不可用状态。 - 增加重试逻辑:针对系统启动阶段的服务未就绪场景,遇到异常后间隔12秒重试,最多重试35次即可覆盖绝大多数服务启动等待场景。
- 可选优化:访问打印资源前先检测Print Spooler服务运行状态,确认服务处于运行状态后再执行打印相关逻辑,进一步降低异常概率。
修改后的代码示例
public static PrinterFailureType CheckPrinterStatus(int retryCount = 3, int retryDelayMs = 1000) { PrinterFailureType returnStatus = PrinterFailureType.None; for (int i = 0; i < retryCount; i++) { try { using (PrintServer ps = new PrintServer()) { using (PrintQueue printQueue = ps.GetPrintQueue("examplePrinter")) { returnStatus = CheckStatus(printQueue); return returnStatus; } } } catch (Exception ex) when (ex is PrintQueueException || ex is PrintServerException || (ex is Win32Exception win32Ex && win32Ex.NativeErrorCode == 1200)) // 1200对应打印机名无效错误码 { returnStatus = PrinterFailureType.NotAvailable; // 最后一次重试无需等待 if (i < retryCount - 1) { Thread.Sleep(retryDelayMs); } } } return returnStatus; }
如果你的应用是开机自启动类型,还可以适当拉长重试间隔、增加重试次数,适配不同性能设备的服务启动速度。
内容的提问来源于stack exchange,提问作者zlallen
相关产品推荐
相关产品推荐

