Redirect e analizzare in tempo reale stdout di un processo di lunga esecuzione in vb.net
-
26-09-2019 - |
Domanda
Questo codice viene eseguito "handbrakecli" (un'applicazione a riga di comando) e pone l'uscita in una stringa:
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
Il problema è che questo può richiedere fino a 20 minuti per completare, durante il quale nulla sarà riportato indietro all'utente. Una volta che è stata completata, vedranno tutto l'output del programma che include i dettagli sullo stato di avanzamento. Non molto utile.
Per questo sto cercando di trovare un esempio che mostra il modo migliore per:
- Avvia un programma esterno (nascosto)
- Controlla periodicamente la sua uscita in quanto visualizza informazioni su di esso del corso (in modo da poter estrarre questo e presentare una barra di percentuale piacevole per l'utente)
- Determinare quando l'applicazione esterna ha finito (quindi non posso continuare con la mia esecuzione di applicazioni)
- Uccidi l'applicazione esterna, se necessario, e di rilevare quando questo è successo (in modo che se l'utente preme "Annulla", ottengo prendere le misure appropriate)
Qualcuno ha qualche frammenti di codice raccomandata?
Soluzione
La proprietà StandardOutput è di tipo StreamReader, che ha metodi diversi ReadToEnd. Sarebbe più codice, ma se è stato utilizzato il metodo di lettura, si potrebbe fare altre cose come fornire all'utente la possibilità di cancellare o segnalare qualche tipo di progresso.
link per leggere il metodo con il codice di esempio:
http://msdn.microsoft. com / it-it / library / ath1fht8 (v = VS.90) aspx
Modifica:
La classe Process ha anche un metodo BeginOutputReadLine che è una chiamata metodo asincrono con callback.