3 Stimmen

Umleiten und Parsen in Echtzeit von stdout eines lang laufenden Prozesses in vb.net

Dieser Code führt "handbrakecli" (eine Befehlszeilenanwendung) aus und legt die Ausgabe in einer Zeichenkette ab:

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 

Das Problem ist, dass dies bis zu 20 Minuten dauern kann, während derer nichts an den Benutzer zurückgemeldet wird. Sobald der Vorgang abgeschlossen ist, sieht er alle Ausgaben der Anwendung, einschließlich der Fortschrittsdetails. Das ist nicht sehr nützlich.

Deshalb versuche ich, ein Beispiel zu finden, das zeigt, wie man es am besten macht:

  1. Starten einer externen Anwendung (versteckt)
  2. Überwachen Sie die Ausgabe in regelmäßigen Abständen, da sie Informationen über den Fortschritt anzeigt (damit ich diese extrahieren und dem Benutzer einen schönen Prozentbalken präsentieren kann)
  3. Feststellen, wann die externe Anwendung beendet ist (damit ich mit der Ausführung meiner eigenen Anwendung nicht fortfahren kann)
  4. Beenden Sie die externe Anwendung, wenn nötig, und erkennen Sie, wann dies geschehen ist (so dass ich, wenn der Benutzer "Abbrechen" drückt, die entsprechenden Schritte einleiten kann).

Hat jemand irgendwelche empfohlenen Code-Schnipsel?

1voto

Jeremy Punkte 4708

Die Eigenschaft StandardOutput ist vom Typ StreamReader, der über andere Methoden als ReadToEnd verfügt. Es wäre mehr Code, aber wenn Sie die Read-Methode verwenden, könnten Sie andere Dinge tun, wie dem Benutzer die Möglichkeit geben, abzubrechen oder eine Art von Fortschritt zu melden.

Link zu Read Method mit Codebeispiel:

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

Bearbeiten:

Die Klasse Process verfügt auch über eine Methode BeginOutputReadLine, die ein asynchroner Methodenaufruf mit Callback ist.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X