capture-Prozess stdout und stderr in die richtige Reihenfolge

Ich einen Prozess starten von C# wie folgt:

public bool Execute()
{
    ProcessStartInfo startInfo = new ProcessStartInfo();

    startInfo.Arguments =  "the command";
    startInfo.FileName = "C:\\MyApp.exe";

    startInfo.UseShellExecute = false;
    startInfo.RedirectStandardOutput = true;
    startInfo.RedirectStandardError = true;

    Log.LogMessage("{0} {1}", startInfo.FileName, startInfo.Arguments);

    using (Process myProcess = Process.Start(startInfo))
    {
        StringBuilder output = new StringBuilder();
        myProcess.OutputDataReceived += delegate(object sender, DataReceivedEventArgs e)
        {
            Log.LogMessage(Thread.CurrentThread.ManagedThreadId.ToString() + e.Data);
        };
        myProcess.ErrorDataReceived += delegate(object sender, DataReceivedEventArgs e)
        {
            Log.LogError(Thread.CurrentThread.ManagedThreadId.ToString() +  " " + e.Data);            
        };

        myProcess.BeginErrorReadLine();
        myProcess.BeginOutputReadLine();

        myProcess.WaitForExit();

    }

    return false;
}

Aber dieser hat ein problem..., wenn die app in Frage, schreibt auf std-out und std err, in dieser Reihenfolge:

std out: msg 1
std err: msg 2
std out: msg 3

Dann die Ausgabe sehe ich aus den Protokollen ist:

msg 2
msg 1
msg 3

Scheint dies zu sein, weil die event-Handler ausgeführt werden, in einem anderen thread. Meine Frage ist also wie kann die Reihenfolge der Prozess schriftlich std err und std-out beibehalten werden?

Ich daran gedacht, mit einem Zeitstempel, aber ich glaube nicht, dass dies funktioniert durch die präventive Natur des threads..

Update: Bestätigt, dass die Verwendung eines Zeitstempels auf die Daten nicht verwenden.

Final update: Die akzeptierte Antwort, die dieses problem löst - aber es hat einen Nachteil, wenn die Ströme zusammengeführt werden, gibt es keine Möglichkeit zu wissen, welche Bach geschrieben wurde. Daher, wenn Sie die Logik der schreiben auf stderr == Fehler, anstatt die app beenden-code, den Sie könnte noch geschraubt werden.

  • Nur als Anregung, haben Sie versucht, ändern der Reihenfolge von BeginErrorReadLine und BeginOutputReadLine Anrufe?
  • Finden Sie die akzeptierte Antwort, dass nicht nicht die Hilfe an alle
InformationsquelleAutor paulm | 2013-08-30
Schreibe einen Kommentar