背景线程打印问题

时间:2011-06-29 11:58:14

标签: .net multithreading printing thread-safety

我不确定这是否与线程问题有关。

我正在将标签打印到标准的Windows打印机上。标签在GDI中绘制,然后传递给另一个在后台线程上打印的对象。

我正在使用BackgroundWorker进行此过程。 LabelPrinter.Print(Label as PrintLabel)启动backgroundWorker并将标签详细信息传递给它。 PrintPage事件处理程序呈现页面并将其发送到打印机。

问题是,用户偶尔会收到错误说明:

System.Drawing.Printing.InvalidPrinterException: Settings to access printer '\\printserver\label' are not valid.
   at System.Drawing.Printing.PrinterSettings.GetHdevmodeInternal()
   at System.Drawing.Printing.PrinterSettings.GetHdevmode(PageSettings pageSettings)
   at System.Drawing.Printing.PrintController.OnStartPrint(PrintDocument document, PrintEventArgs e)
   at System.Drawing.Printing.StandardPrintController.OnStartPrint(PrintDocument document, PrintEventArgs e)
   at System.Drawing.Printing.PrintController.Print(PrintDocument document)
   at System.Drawing.Printing.PrintDocument.Print()

用户只会偶尔得到这个,虽然我知道连续打印多个标签(标签之间几分钟)会更糟。他们将能够整天打印标签,当他们突然发现此错误并获得4或5次时,问题通常就会消失。

2 个答案:

答案 0 :(得分:4)

这是打印机驱动程序引起的问题。对本机DocumentProperties()API函数的调用失败。不幸的是,它没有一个很好的方法来确切地指出什么是错误的,错误返回并不意味着“它没有工作”。除了标准的“更新驱动程序”方法之外,联系打印机制造商寻求支持将是您最好的选择。当呼叫失败时,他们想要确切地知道该打印机可能发生了什么。包括打印机状态以及是否有人正在修改打印机属性。

如果此异常重复良好,那么捕获异常就是可能的黑客攻击。在打印机完成任何操作之前,它很早就会发生。睡几秒钟然后再试一次。不要永远重试。

答案 1 :(得分:1)

如果打印机是网络打印机(具有以太网端口),您可能希望尝试直接与此打印机通信,而不是使用打印机共享(\ server \ printer)。直接我的意思是installing it as local tcp/ip printer

在以这种方式与打印机通信时,我总是有更高的可靠性,而不是使用打印机共享。