You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 10:51:00