首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >进程WaitForExit未等待

进程WaitForExit未等待
EN

Stack Overflow用户
提问于 2016-11-23 20:04:42
回答 3查看 6.8K关注 0票数 4

我已经创建了打印假脱机应用程序来异步打印pdf。

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

以下是代码

代码语言:javascript
复制
   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代码。它确实执行了(这里//一些东西),即使我的文档在打印机队列中。

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

EN

回答 3

Stack Overflow用户

发布于 2016-11-23 20:16:05

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

  • 或者直接启动pdfprint.exe (为什么这里需要Windows命令行?)
  • 或者找到子进程的进程对象--例如通过WMI、as described here --然后等待该进程退出。

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

票数 8
EN

Stack Overflow用户

发布于 2017-03-21 06:08:08

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

  1. 进入while循环,直到目标文件存在(理想情况下会超时,以防pdfprint.exe遇到问题,永远不会生成文件)
  2. 进入第二个while循环,其中每X毫秒(比如,500? 1000?)检查输出文件的长度。如果两次检查的文件大小相同,则假定输出过程已完成,并开始处理该文件。

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

票数 0
EN

Stack Overflow用户

发布于 2017-03-21 23:49:48

你试过这个吗?

procStartInfo.LoadUserProfile = true;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40764093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档