Process WaitForExit不在等待
问题描述:
我创建了Print spooler应用程序以异步打印pdf。Process WaitForExit不在等待
(应用程序使用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代码等等。它执行(在这里//某些东西),即使我的文档在打印机队列中。
是否有任何其他方式通知打印完成后?
答
你的代码等待cmd.exe
完成,它可能会在子进程启动pdfprint.exe
后立即终止。我建议你
- 直接启动
pdfprint.exe
(你为什么在这里需要在Windows命令行呢?) - 或发现孩子进程的进程对象 - 例如通过WMI,as described here - 并且等待那进程退出。
但是,如果pdfprint.exe
实际上是计划的打印作业等待完成这两种方法才有效。我不知道这个工具,所以我不知道它是否表现如此。如果没有,你将不得不访问打印队列,这是不推荐的(正如汉斯在他的评论中指出的那样)。
答
这是您可能需要采取的If-Everything-Else-Fails方法(如果pdfprint.exe不等到终止完成)。它的丑陋,但它会工作:
- ,直到目标文件存在输入while循环(最好是使用 超时,万一pdfprint.exe运行到一个问题,从来没有 生成文件)
- 输入第二个while循环,其中每X毫秒(例如500? 1000?),它会检查输出PDF的文件长度。如果文件大小在检查之间相同,则假定输出过程是 已完成并开始使用该文件。
就像我说的那样,它不漂亮(除非你没有追索权,否则你不应该使用它)......但它可以完成工作。我必须使用这种方法来处理通过网络复制的传入文件(您需要在文件进入时处理文件,但是您需要知道该文件在复制之前完成了复制,因为PDF将锁定只要他们打开,然后文件复制将失败。)
也知道,如果你尝试手动打开控制台,并执行你的命令,如果控制台立即给你回一个提示,即使你执行的程序继续运行,那么你的WaitForExit代码将只能等待'cmd'进程(控制台)退出,而不是其他程序。 –
此外,你不是逃避反斜杠,所以:'“E:\ P ...'应该是'@”E:\ P ...'。 –
感谢您的回复@ LasseV.Karlsen。但是我没有收到任何错误,打印过程没有任何错误。 – Munavvar