Process.Exited n’est jamais appelé, même si EnableRaisingEvents est défini sur true

J’ai un exécutable, qui fonctionne bien lorsque je l’exécute manuellement, et il existe comme il se doit avec le résultat attendu. Mais lorsque je l’exécute avec la méthode ci-dessous, l’événement Process.Exited n’est jamais déclenché. Notez que je me suis souvenu du Process.EnableRaisingEvents

protected override Result Execute(RunExecutable task) { var process = new Process(); process.StartInfo.Arguments = task.Arguments; process.StartInfo.FileName = task.ExecutablePath; process.StartInfo.CreateNoWindow = true; process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardOutput = true; process.EnableRaisingEvents = true; process.Exited += (sender, args) => { processSync.OnNext(new Result { Success = process.ExitCode == 0, Message = process.StandardOutput.ReadToEnd() }); processSync.OnCompleted(); }; process.Start(); return processSync.First();; } 

Le problème est le même, si j’utilise Process.WaitForExit () au lieu d’extensions réactives, d’attendre l’événement de sortie.

En outre, si je lance le processus avec un autre argument, ce qui produit une autre sortie, il existe très bien.

Cela semble avoir quelque chose à voir avec le process.StartInfo.RedirectStandardOutput = true; depuis quand je le désactive, cela fonctionne. Mais cela pourrait simplement être le symptôme d’un autre problème.

Toute aide est appréciée 🙂

Il y a une impasse dans votre code. La «sortie standard» est simplement une sorte de canal nommé, qui dispose d’un petit tampon pour transférer les données d’un processus à l’autre. Si le tampon est plein, le processus d’écriture doit attendre que le processus de lecture récupère des données du tampon.

Ainsi, le processus que vous avez démarré peut attendre que vous lisiez à partir de la sortie standard, mais vous attendez que le processus se termine avant de commencer à lire -> impasse.

La solution consiste à lire en continu pendant que le processus est en cours – il suffit d’appeler StandardOutput.ReadToEnd() avant d’appeler WaitForExit() . Si vous souhaitez lire sans bloquer le thread actuel, vous pouvez utiliser BeginOutputReadLine() et les événements OutputDataReceived .

Apparemment, vous devez écouter le stream StandardOutput si vous le redirigez, sinon le processus ne se terminera pas. Il attend que quelqu’un lise la sortie en premier.

Process.Exited event n’est pas appelé