2016-11-23 34 views
3

我創建了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

回答

6

你的代碼等待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

0

這是您可能需要採取的If-Everything-Else-Fails方法(如果pdfprint.exe不等到終止完成)。它的醜陋,但它會工作:

  1. ,直到目標文件存在輸入while循環(最好是使用 超時,萬一pdfprint.exe運行到一個問題,從來沒有 生成文件)
  2. 輸入第二個while循環,其中每X毫秒(例如500? 1000?),它會檢查輸出PDF的文件長度。如果文件大小在檢查之間相同,則假定輸出過程是 已完成並開始使用該文件。

就像我說的那樣,它不漂亮(除非你沒有追索權,否則你不應該使用它)......但它可以完成工作。我必須使用這種方法來處理通過網絡複製的傳入文件(您需要在文件進入時處理文件,但是您需要知道該文件在複製之前完成了複製,因爲PDF將鎖定只要他們打開,然後文件複製將失敗。)

0

你試過嗎?

procStartInfo.LoadUserProfile = true;

+1

它不會改變任何東西。感謝您的回答 – Munavvar