2011-07-26 6 views
1

주 서비스에서 간단한 TCP 하트 비트를 확인하는 모니터링 서비스 (Windows 서비스의 형태로)를 사용하는 프로젝트에서 작업하고 있습니다. 특정 시간 동안 하트 비트가 감지되지 않거나 주 서비스 프로세스가 전혀 감지되지 않을 때마다 새 서비스가 시작됩니다. 한 번에 하나의 주 서비스 만 실행되도록하기 위해 새 인스턴스를 시작하기 전에 현재 실행중인 모든 프로세스를 동일한 이름으로 닫습니다.Process.WaitForExit 메서드 Thows InvalidOperation 예외 Process.Close 후

I 다음 코드로부터 비롯 가졌다 문제 :

var processes = from p in Process.GetProcessesByName("Acme") select p; 

foreach (var process in processes) 
{ 
    ... 

    process.Close(); 

    process.WaitForExit(10000); 
    if (!process.HasExited) 
     process.Kill(); 
} 

가 발표 process.Close() 메소드는이 프로세스와 연관된 모든 자원은 WaitForExit() 메소드가 예외를 던진 때문이다. 나는 곧바로 메인 프로세스에서 클린업 메소드를 종료시키고 싶었 기 때문에 프로세스를 즉시 종료 (kill)하고 싶지는 않았다.

내 문제의 해결책은 process.Close() 대신에 관련된 모든 정리 메소드를 호출하고 WaitForExit() 메소드 이후까지 자원을 해제하지 않은 대신 process.CloseMainWindow()를 호출하는 것이 었습니다.

이 문제에 대한 좀 더 우아한 해결책이 있으면 알려 주시기 바랍니다.

답변

4

Process.Close 실제 프로세스가 종료되지 않습니다. 프로세스에 전혀 영향을 미치지 않습니다. 그것은 단지 당신의 의도가 프로세스를 종료하는 경우, 당신은 Process.Kill 또는 Process.CloseMainWindow 같은 다른 방법을 사용해야합니다

(당신이 발견으로 그 후에는 더 이상 사용할 수)에 Process 클래스의 자원을 해제하지 않습니다.

Process.Close은 다른 용도로 사용됩니다. Process 클래스 인스턴스를 완료 한 후에는 (Process.Dispose) 호출해야합니다.

관련 문제