C# 如果未安装驱动程序,.NET PrintDocument打印方法线程将无限运行

C# 如果未安装驱动程序,.NET PrintDocument打印方法线程将无限运行,c#,.net,printing,C#,.net,Printing,我有一个应用程序,可以在报告呈现后打印报告并通过电子邮件发送给人们,只要在运行代码的机器上安装了打印机的驱动程序,它就可以正常工作。如果机器没有安装打印机的驱动程序,它只会在没有反馈的情况下继续运行进程,我花了很长时间才弄明白,因为没有反馈。是否有方法检查PrintDocument对象以查看是否可以建立连接,并在没有连接(没有驱动程序)时抛出错误?下面是我的代码片段示例: PrintDocument pd = new PrintDocument(); using (WindowsImperso

我有一个应用程序,可以在报告呈现后打印报告并通过电子邮件发送给人们,只要在运行代码的机器上安装了打印机的驱动程序,它就可以正常工作。如果机器没有安装打印机的驱动程序,它只会在没有反馈的情况下继续运行进程,我花了很长时间才弄明白,因为没有反馈。是否有方法检查PrintDocument对象以查看是否可以建立连接,并在没有连接(没有驱动程序)时抛出错误?下面是我的代码片段示例:

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属性指定了有效的打印机;否则,错误