Перенаправление и анализ в режиме реального времени stdout длительного процесса в vb.net - PullRequest
3 голосов
/ 12 апреля 2010

Этот код выполняет «handbrakecli» (приложение командной строки) и помещает вывод в строку:

Dim p As Process = New Process    
p.StartInfo.FileName = "handbrakecli"
p.StartInfo.Arguments = "-i [source] -o [destination]"
p.StartInfo.UseShellExecute = False
p.StartInfo.RedirectStandardOutput = True
p.Start

Dim output As String = p.StandardOutput.ReadToEnd
p.WaitForExit 

Проблема в том, что это может занять до 20 минут, в течение которых пользователю ничего не сообщается. Как только он будет завершен, они увидят все выходные данные из приложения, в том числе сведения о ходе выполнения. Не очень полезно.

Поэтому я пытаюсь найти образец, который показывает лучший способ:

  1. Запустить внешнее приложение (скрытое)
  2. Периодически контролировать его вывод, так как он отображает информацию о его прогрессе (так что я могу извлечь его и представить пользователю хороший процентный бар)
  3. Определите, когда завершилось внешнее приложение (поэтому я не могу продолжить выполнение своих собственных приложений)
  4. При необходимости убить внешнее приложение и определить, когда это произошло (так что, если пользователь нажмет «Отмена», я получу соответствующие шаги)

У кого-нибудь есть рекомендуемые фрагменты кода?

1 Ответ

1 голос
/ 12 апреля 2010

Свойство StandardOutput имеет тип StreamReader, который имеет методы, отличные от ReadToEnd. Было бы больше кода, но если бы вы использовали метод Read, вы могли бы делать другие вещи, такие как предоставление пользователю возможности отменить или сообщить о каком-либо прогрессе.

Ссылка на метод чтения с примером кода:

http://msdn.microsoft.com/en-us/library/ath1fht8(v=VS.90).aspx

Edit:

Класс Process также имеет метод BeginOutputReadLine, который является асинхронным вызовом метода с обратным вызовом.

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.beginoutputreadline(v=VS.90).aspx

...