プロセスのExitedメソッドが呼び出されないのはなぜですか?


96

次のコードがありますが、ProcessExitedメソッドが呼び出されないのはなぜですか?Windowsシェル(startInfo.UseShellExecute = false)を使用しない場合も同様です。

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = true;
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.FileName = path;
startInfo.Arguments = rawDataFileName;
startInfo.WorkingDirectory = Util.GetParentDirectory(path, 1);

try
{
     Process correctionProcess = Process.Start(startInfo);
     correctionProcess.Exited += new EventHandler(ProcessExited);                   

     correctionProcess.WaitForExit();

     status = true;
}

.....

internal void ProcessExited(object sender, System.EventArgs e)
{
      //print out here
}

回答:


241

Exitedイベント時にコールバックを受信するには、EnableRaisingEventsをtrueに設定する必要があります。

Process correctionProcess = Process.Start(startInfo);
correctionProcess.EnableRaisingEvents = true;
correctionProcess.Exited += new EventHandler(ProcessExited); 

3
correctProcess.WaitForExit()、この関数がないと、このコードは機能しません
Kira

7
1つの小さなヒント(C#以外の専門家向けのesp):Close()プロセスを実行しないでください!リソース管理の誤った取り組みにより、Exitハンドラーで断続的な問題が発生しました。問題のコードは、GCがやがてそれを収集できるようにするのではなく、Process.Close()後で呼び出されましたProcess.Start(startInfo)。背景がGC以外の言語(C / C ++など)の場合、簡単な間違いです。
Jerzy

3
すごい。ありがとう。また、の割り当てはEnableRaisingEvents、のEventHandlers直後に行わなければならないことに注意してくださいProcess.Start()。それ以外の場合は機能しません。
Doruk、2016

2
@Doruk EnableRaisingEvents=true呼び出す前に設定できProcess.Start()、問題なく動作します。
アクションダン

29

MSDNから:

Exitedイベントは、関連するプロセスが終了したことを示します。この発生は、プロセスが終了(中止)または正常に終了したことを意味します。このイベントは、EnableRaisingEventsプロパティの値がtrueの場合にのみ発生します。

そのプロパティをtrueに設定しましたか?


19
これも非常に偶発的ではないフラグです(とにかく使用方法を教えてください。イベントが必要ない場合は、購読しません!)
TamásSzelei 14年

3
あまり直感的ではありません。各イベントの説明で、このフラグを設定する必要があることを明確に述べるべきです。
TheLegendaryCopyCoder 2017年

18

あなたは、設定する必要がありますProcess.EnableRaisingEventstrue



9

new Process()にある例に出くわしましたusing。このExited機能を使用する場合は、これを行わないでください。このusing句は、のイベントハンドルとともにインスタンスを破棄しますExited

この...

using(var process = new Process())
{
   // your logic here
}

これは...

var process = new Process();

私もそれに気づきました。不思議なことに、OutputDataReceivedイベントは正常に機能します。または、メインスレッドでの実行がEnd Usingに到達する前に発生するほど高速に発生する場合があります。
AlexVB
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.