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代码等等。它执行(在这里//某些东西),即使我的文档在打印机队列中。

是否有任何其他方式通知打印完成后?

+0

也知道,如果你尝试手动打开控制台,并执行你的命令,如果控制台立即给你回一个提示,即使你执行的程序继续运行,那么你的WaitForExit代码将只能等待'cmd'进程(控制台)退出,而不是其他程序。 –

+0

此外,你不是逃避反斜杠,所以:'“E:\ P ...'应该是'@”E:\ P ...'。 –

+0

感谢您的回复@ LasseV.Karlsen。但是我没有收到任何错误,打印过程没有任何错误。 – Munavvar

你的代码等待cmd.exe完成,它可能会在子进程启动pdfprint.exe后立即终止。我建议你

  • 直接启动pdfprint.exe(你为什么在这里需要在Windows命令行呢?)
  • 或发现孩子进程的进程对象 - 例如通过WMI,as described here - 并且等待进程退出。

但是,如果pdfprint.exe实际上是计划的打印作业等待完成这两种方法才有效。我不知道这个工具,所以我不知道它是否表现如此。如果没有,你将不得不访问打印队列,这是不推荐的(正如汉斯在他的评论中指出的那样)。

+0

直接启动pdfprint.exe也没有帮助。 – Munavvar

+0

@Munavvar如果是这样,程序“pdfprint.exe”可能会在开始另一个进程后立即终止。 – align

+0

@align是的你是对的。但我怎样才能完成我的任务? – Munavvar

这是您可能需要采取的If-Everything-Else-Fails方法(如果pdfprint.exe不等到终止完成)。它的丑陋,但它会工作:

  1. ,直到目标文件存在输入while循环(最好是使用 超时,万一pdfprint.exe运行到一个问题,从来没有 生成文件)
  2. 输入第二个while循环,其中每X毫秒(例如500? 1000?),它会检查输出PDF的文件长度。如果文件大小在检查之间相同,则假定输出过程是 已完成并开始使用该文件。

就像我说的那样,它不漂亮(除非你没有追索权,否则你不应该使用它)......但它可以完成工作。我必须使用这种方法来处理通过网络复制的传入文件(您需要在文件进入时处理文件,但是您需要知道该文件在复制之前完成了复制,因为PDF将锁定只要他们打开,然后文件复制将失败。)

你试过吗?

procStartInfo.LoadUserProfile = true;

+1

它不会改变任何东西。感谢您的回答 – Munavvar