내 프로세스의 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
correctionProcess.WaitForExit ()는이 기능이없는이 코드는 나를 위해 작동하지 않습니다
키라

7
작은 팁 하나 (C # 전문가가 아닌 경우 특히) : Close()프로세스를 수행하지 마십시오 ! 리소스 관리에 대한 잘못된 노력으로 인해 Exit 처리기에 간헐적 인 문제가 발생했습니다. 문제의 코드가 호출 Process.Close()Process.Start(startInfo)오히려 GC 인해 과정에서 수집 할 수 있도록보다. 배경이 GC가 아닌 언어 (예 : C / C ++)이면 쉽게 실수 할 수 있습니다.
Jerzy

3
큰. 감사. 나는 또한 그 지정을 발언 할 EnableRaisingEventsEventHandlers애프터 정확하게 수행해야합니다 Process.Start(). 그렇지 않으면 작동하지 않습니다.
DORUK

2
@Doruk EnableRaisingEvents=true전화하기 전에 설정할 수 Process.Start()있으며 잘 작동합니다.
Action Dan

29

에서 MSDN :

Exited 이벤트는 관련 프로세스가 종료되었음을 나타냅니다. 이 발생은 프로세스가 종료 (중단)되었거나 성공적으로 종료되었음을 의미합니다. 이 이벤트는 EnableRaisingEvents 속성 값이 true 인 경우에만 발생할 수 있습니다.

해당 속성을 true로 설정 했습니까?


19
그것은 매우 해제 숙어 플래그, 너무 (! 사용이 나는 이벤트를 원하지 않는 경우, 나는 그것에 가입하지 않은, 어쨌든 무엇)이다
타마스 Szelei

3
별로 직관적이지 않습니다. 이 플래그를 설정해야 함을 각 이벤트 설명에 명확하게 명시해야합니다.
TheLegendaryCopyCoder

18

당신은 설정해야합니다 Process.EnableRaisingEvents으로 true.



10

new Process()에있는 예를 보았습니다 using. Exited기능 을 사용하려면 그렇게하지 마십시오 . 이 using절은의 모든 이벤트 핸들과 함께 인스턴스를 파괴합니다 Exited.

이...

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

이거 ...

var process = new Process();

저도 알아 차 렸습니다. 이상하게도 OutputDataReceived 이벤트는 정상적으로 작동합니다. 또는 너무 빨리 발생하여 메인 스레드에서 실행이 끝나기 전에 사용할 수 있습니다.
AlexVB
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.