处理WaitForExit不等待

时间:2016-11-23 12:04:42

标签: c# .net printing process processstartinfo

我创建了Print spooler应用程序来异步打印pdf。

(应用程序使用veryPDF命令从网络打印机打印)

这是代码

   var procStartInfo = new System.Diagnostics.ProcessStartInfo("cmd", " /c" + "E:\pdfprint_cmd\pdfprint.exe -$ 388444444448350FA394 E:\PrintSpoolerApplication\PrintSpoolerApplication\bin\Debug\45940.pdf");
   procStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
   procStartInfo.Verb = "runas";
   procStartInfo.UseShellExecute = false;
   procStartInfo.CreateNoWindow = true;
   var proc = new System.Diagnostics.Process();
   proc.StartInfo = procStartInfo;
   proc.Start();
   proc.WaitForExit();

// Some stuff

但它没有等待WaitForExit代码。即使我的文档在打印机队列中,它也会执行(这里//某些东西)。

打印完成后还有其他通知方法吗?

3 个答案:

答案 0 :(得分:6)

您的代码等待cmd.exe完成,其(可能)在作为子进程启动pdfprint.exe后立即终止。我建议你

  • 直接启动pdfprint.exe(为什么还要在这里使用Windows命令行?)
  • 或找到子进程的Process对象 - 例如通过WMI,as described here - 并等待 进程退出。

但是,只有pdfprint.exe实际等待计划的打印作业完成时,这两种方法才有效。我不知道这个工具,所以我不知道它是否表现得那么好。如果没有,则必须访问打印队列,不建议(正如Hans在评论中指出的那样)。

答案 1 :(得分:0)

这是你可能不得不采取的If-Everything-Else-Fails方法(如果pdfprint.exe不等到终止完成)。这很难看,但它会起作用:

  1. 输入while循环,直到目标文件存在(理想情况下为 超时,以防pdfprint.exe遇到问题而永远不会 生成文件)
  2. 输入第二个while循环,每隔X毫秒(比如说500? 1000?),它检查输出PDF的文件长度。如果是文件 检查之间的大小是相同的,您假设输出过程是 完成并开始使用该文件。
  3. 就像我说的那样,它并不漂亮(你不应该使用它,除非你没有追索权)......但是它完成了工作。我必须使用这种方法来处理通过网络复制的传入文件(你需要在文件进入时处理它们,但你需要知道文件在被触摸之前已经完成复制,因为PDF会锁定一旦打开它们,然后文件复制将失败。)

答案 2 :(得分:0)

你试过这个吗?

procStartInfo.LoadUserProfile = true;