2016-11-23 13 views
3

Я создал приложение для диспетчера очереди печати для печати в формате PDF асинхронно.Процесс 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. Введите время цикла, пока файл назначения не существует (в идеале с тайм-аут, в случае, если pdfprint.exe работает в проблему, и никогда не генерирует файл)
  2. Введите второй цикл while, где каждые X миллисекунд (скажем, 500? 1000?), Он проверяет длину файла выходного PDF. Если размер файла одинаковый между проверками, вы предполагаете, что процесс вывода завершен и начинается работа с файлом .

Как я уже сказал, это не очень хорошо (и вы не должны использовать его, если у вас нет возможности обратиться за помощью) ... но он выполняет свою работу. Мне пришлось использовать такой подход для обработки входящих файлов, которые копируются по сети (вам нужно обрабатывать файлы, когда они входят, но вам нужно знать, что файл будет скопирован, прежде чем прикоснуться к нему, поскольку файлы PDF будут заблокированы как только они откроются, а затем копия файла завершится с ошибкой.)

0

Вы пробовали это?

procStartInfo.LoadUserProfile = true;

+1

Это ничего не меняет. Спасибо за Ваш ответ – Munavvar