【问题标题】:Process WaitForExit not waiting进程 WaitForExit 不等待
【发布时间】:2017-04-07 10:34:42
【问题描述】:

我创建了 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 代码。即使我的文档在打印机队列中,它也确实执行了(这里 //Some stuff)。

有没有其他方法可以在打印完成时发出通知?

【问题讨论】:

  • 也知道如果你尝试手动打开一个控制台并执行你的命令,即使你执行的程序一直在运行,如果控制台立即给你一个提示,那么你的 WaitForExit 代码只会等待cmd进程(控制台)退出,而不是那个其他程序。
  • 此外,您没有转义反斜杠,因此:"E:\p... 应该是 @"E:\p...
  • 感谢@LasseV.Karlsen 的回复。但我没有收到任何错误,打印过程没有任何错误。
  • 那么问题是你在等待控制台进程返回,而不是打印进程。
  • 使用 start /wait 告诉 cmd.exe 在进程完成之前不要完成。或者根本不使用 cmd.exe,因为它没有做任何有用的事情。像这样的程序可能只是将打印作业转储到后台处理程序中,并且不会等待它被打印。您必须处理 System.Printing.PrintQueue,不推荐。

标签: c# .net printing process processstartinfo


【解决方案1】:

你试过了吗?

procStartInfo.LoadUserProfile = true;

【讨论】:

  • 它不会改变任何东西。谢谢你的回答
【解决方案2】:

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

  1. 进入一个 while 循环,直到目标文件存在(最好使用 超时,以防 pdfprint.exe 遇到问题并且永远不会 生成文件)
  2. 进入第二个 while 循环,每 X 毫秒(例如,500? 1000?),它检查输出PDF的文件长度。如果文件 检查之间的大小相同,您假设输出过程是 完成并开始处理该文件。

就像我说的那样,它并不漂亮(除非你没有追索权,否则你不应该使用它)......但它可以完成工作。我不得不使用这种方法来处理通过网络复制的传入文件(您需要在文件进入时对其进行处理,但您需要在触摸文件之前知道文件已完成复制,因为 PDF 会锁定一旦打开它们,文件复制就会失败。)

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 直接按进程启动 pdfprint.exe 也无济于事。
    • @Munavvar 如果是这样,程序“pdfprint.exe”可能会在启动另一个进程后立即终止。
    • @align 是的,你是对的。但是我怎样才能完成我的任务呢?
    • 要完成您的任务,您需要了解 pdfprint.exe 是如何工作的,例如创建了哪些子进程(如果有)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多