Redirecionar e analisar em tempo real de um processo de longa execução no VB.NET
-
26-09-2019 - |
Pergunta
Este código executa "Handbrakecli" (um aplicativo de linha de comando) e coloca a saída em uma string:
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
O problema é que isso pode levar até 20 minutos para ser concluído, durante o qual nada será relatado de volta ao usuário. Depois de concluído, eles verão toda a saída do aplicativo, que inclui detalhes de progresso. Não é muito útil.
Portanto, estou tentando encontrar uma amostra que mostre a melhor maneira de:
- Inicie um aplicativo externo (oculto)
- Monitore sua produção periodicamente, pois exibe informações sobre seu progresso (para que eu possa extrair isso e apresentar uma boa barra de porcentagem ao usuário)
- Determine quando o aplicativo externo terminou (para que eu não possa continuar com minha própria execução de aplicativos)
- Mate o aplicativo externo, se necessário, e detecte quando isso acontecer (para que, se o usuário acertar "cancelar", eu tome as etapas apropriadas)
Alguém tem algum trecho de código recomendado?
Solução
A propriedade StandardOutput é do tipo StreamReader, que possui outros métodos que não o ReadToEnd. Seria mais código, mas se você usasse o método de leitura, poderá fazer outras coisas como fornecer ao usuário a oportunidade de cancelar ou relatar algum tipo de progresso.
Link para ler o método com o exemplo de amostra:
http://msdn.microsoft.com/en-us/library/ath1fht8(v=vs.90).aspx
Editar:
A classe de processo também possui um método BeginOutputReadLine, que é uma chamada de método assíncrona com retorno de chamada.
http://msdn.microsoft.com/en-us/library/system.diagnostics.process.beginoutputreadline(v=vs.90).aspx