尝试从默认打印机获取打印作业时,GetPrintJobInfoCollection()抛出NullReferenceException

时间:2017-06-27 10:39:01

标签: c# .net printing console-application jobs

我正在尝试使用以下代码在控制台上显示当前处于默认打印机的打印队列中的打印作业:

for (;;)
{
    string printerName = new System.Drawing.Printing.PrinterSettings().PrinterName;
    System.Printing.LocalPrintServer localPrintServer = new System.Printing.LocalPrintServer();
    System.Printing.PrintQueueCollection printQueues = localPrintServer.GetPrintQueues(new[] { System.Printing.EnumeratedPrintQueueTypes.Local, System.Printing.EnumeratedPrintQueueTypes.Connections });

    if (printQueues == null) return;

    System.Printing.PrintQueue queue = printQueues.Where(x => x.Name.Equals(printerName)).FirstOrDefault();
    if (queue.NumberOfJobs <= 0)
        Console.WriteLine("Queue Empty!");
    else
    {
        Console.WriteLine("Number of Jobs: " + queue.NumberOfJobs);
        foreach (System.Printing.PrintSystemJobInfo psji in queue.GetPrintJobInfoCollection())
        {
            Console.WriteLine(psji.Name);
        }
        Console.WriteLine("\n\nPress any key to exit...");
        Console.ReadLine();
        break;
    }
}

当打印队列中没有项目时,它会成功显示&#34; Queue Empty!&#34;。

但是当我开始文档打印时,NumberOfJobs = 1但GetPrintJobInfoCollection()会抛出NullReferenceException

为什么有工作并且仍在返回null

可能是什么原因?

另外,我没有打印机,所以我试图将它打印在&#34; Microsoft Print to PDF&#34;。

1 个答案:

答案 0 :(得分:3)

如果查看Microsoft link,它会显示在请求GetPrintJobInfoCollection之前刷新队列。

虽然,你只是抓住了队列的结果似乎是合乎逻辑的,但他们的例子特别刷新的事实表明这是要走的路。