Process.Exited wird nie aufgerufen, obwohl EnableRaisingEvents auf true festgelegt ist

8

Ich habe eine ausführbare Datei, die läuft, wenn ich sie manuell ausführe, und sie existiert so wie sie sollte mit der erwarteten Ausgabe. Aber wenn ich es mit der folgenden Methode starte, wird das Process.Exited-Ereignis nie ausgelöst. Beachten Sie, dass ich mich an Process.EnableRaisingEvents erinnert habe

%Vor%

Das Problem ist dasselbe, wenn ich Process.WaitForExit () anstelle von reaktiven Erweiterungen verwende, um auf das Exit-Ereignis zu warten.

Auch wenn ich den Prozess mit einem anderen Argument ausführe, das eine andere Ausgabe erzeugt, ist es in Ordnung.

Es scheint etwas mit der process.StartInfo.RedirectStandardOutput = true; zu tun zu haben, denn wenn ich das deaktiviere, funktioniert es. Aber das könnte nur ein Symptom für ein anderes Problem sein.

Jede Hilfe wird geschätzt: -)

    
Lars Udengaard 28.02.2012, 15:11
quelle

2 Antworten

6

Es gibt einen Deadlock in Ihrem Code. 'Standardausgabe' ist nur eine Art Named Pipe, die einen kleinen Puffer hat, um Daten von einem Prozess zum anderen zu übertragen. Wenn der Puffer voll ist, muss der Schreibprozess darauf warten, dass der Lesevorgang einige Daten aus dem Puffer abruft.

Der Prozess, den Sie gestartet haben, wartet möglicherweise darauf, dass Sie von der Standardausgabe lesen, aber Sie warten darauf, dass der Prozess abgeschlossen ist, bevor Sie mit dem Lesen beginnen - & gt; Deadlock.

Die Lösung besteht darin, kontinuierlich zu lesen, während der Prozess läuft - rufen Sie einfach StandardOutput.ReadToEnd() auf, bevor Sie WaitForExit() aufrufen. Wenn Sie lesen möchten, ohne den aktuellen Thread zu blockieren, können Sie BeginOutputReadLine() und die OutputDataReceived -Ereignisse verwenden.

    
Daniel 28.02.2012, 15:19
quelle
1

Offenbar müssen Sie den StandardOutput-Stream anhören, wenn Sie ihn umgeleitet haben, andernfalls wird der Prozess nicht beendet. Es wartet darauf, dass jemand die Ausgabe zuerst liest.

Process.Exited-Ereignis wird nicht aufgerufen

    
Lars Udengaard 28.02.2012 15:20
quelle

Tags und Links