C# 如果未安装驱动程序,.NET PrintDocument打印方法线程将无限运行
我有一个应用程序,可以在报告呈现后打印报告并通过电子邮件发送给人们,只要在运行代码的机器上安装了打印机的驱动程序,它就可以正常工作。如果机器没有安装打印机的驱动程序,它只会在没有反馈的情况下继续运行进程,我花了很长时间才弄明白,因为没有反馈。是否有方法检查PrintDocument对象以查看是否可以建立连接,并在没有连接(没有驱动程序)时抛出错误?下面是我的代码片段示例:C# 如果未安装驱动程序,.NET PrintDocument打印方法线程将无限运行,c#,.net,printing,C#,.net,Printing,我有一个应用程序,可以在报告呈现后打印报告并通过电子邮件发送给人们,只要在运行代码的机器上安装了打印机的驱动程序,它就可以正常工作。如果机器没有安装打印机的驱动程序,它只会在没有反馈的情况下继续运行进程,我花了很长时间才弄明白,因为没有反馈。是否有方法检查PrintDocument对象以查看是否可以建立连接,并在没有连接(没有驱动程序)时抛出错误?下面是我的代码片段示例: PrintDocument pd = new PrintDocument(); using (WindowsImperso
PrintDocument pd = new PrintDocument();
using (WindowsImpersonationContext wic = WindowsIdentity.Impersonate(IntPtr.Zero))
{
//code to send printdocument to the printer
//Set Your Printer Name here
printerSettings.PrinterName = printerName;
pd.PrinterSettings = printerSettings;
pd.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);
pd.Print(); //If no driver found, the PrintPage Event Handler never fires
}
事实上,我找到了一个适合我特殊情况的答案。由于我不知道要查找的打印机的名称,也不允许用户将打印机的名称输入客户端,因此我可以查看机器上已安装打印机的列表,确保它们指定的打印机显示在列表中,如果不显示,我可以抛出异常:
var printerList = PrinterSettings.InstalledPrinters.Cast<string>().ToList();
bool printerFound = printerList.Any(p => p == printerName);
if (printerFound)
{
//Do print stuff
}
else
{
//throw exception or send message
}
var printerList=PrinterSettings.InstalledPrinters.Cast().ToList();
bool printerFound=printerList.Any(p=>p==printerName);
if(printerFound)
{
//做印刷品
}
其他的
{
//抛出异常或发送消息
}
PrinterSettings.IsValid属性
获取一个值,该值指示PrinterName属性是否指定了有效的打印机
if (!pd.PrinterSettings.IsValid)
throw new Exception("this little maneuver would have cost us 51 years");
pd.Print();
true
如果PrinterName属性指定了有效的打印机;否则,错误