2013-03-19 1 views
3

프로세스 B를 시작하는 프로세스 A가 있습니다.
이들은 WCF (IAsyncResult APM 패턴)로 통신하며, A는 클라이언트 B 서비스입니다. 프로세스 A가 죽었을 때
, 난 내가 B 처리하는 과정을 인수 같은 ID를 보내고 B.가장 좋은 방법은 호스팅 된 프로세스를 닫습니다.

을 닫아야합니다 그는 않습니다 :이 제대로 작동

Process.GetProcessById(processId).WaitForExit(); 

.
제 질문은 프로세스가 죽으면 프로세스 b를 죽이는 방법입니다.

나는 시도 모두 다음 일

Process.GetCurrentProcess().Close(); 
Process.GetCurrentProcess().Dispose(); 
Application.Exit(); > its a guiless winform application 

유일한 것은이었다

Process.GetCurrentProcess().Kill(); 

을하지만 과정을 죽이는 밤은 너무 잔인?

코드를 추가 :
프로세스 B를 주요 내부 :

TrackExternalProcess(externalProcessId,() => { OnExternalProcessClosed(); }); 

공공 방법 :

public static void TrackExternalProcess(int processId, Action onExternalProcessClosed) 
    { 
     new Thread(new ThreadStart(delegate 
     { 
      try 
      { 
       Thread.CurrentThread.IsBackground = true; 
       Process.GetProcessById(processId).WaitForExit(); 

       logger.Error("Host process quit unexpectedly"); 

       onExternalProcessClosed(); 
      } 
      catch (Exception) 
      { 
      } 
     })).Start(); 
    } 

    public static void OnExternalProcessClosed() 
    { 
     Process.GetCurrentProcess().Kill(); 

    } 
+0

B에서 아무 것도 시도하지 않고 무엇인가하지 않으면 어떻게됩니까? 대신 Application.Start();를 실행하면 A가 종료되면 종료됩니다. – PhonicUK

+0

Application.Start()가 없습니다. – ilansch

+0

Kill()을 사용하는 것은 좋으며 너무 잔인하지 않아도됩니다. 프로세스 A에 대한 이벤트 핸들러를 작성하여 닫히거나 중단 될 때를 알 수 있습니다. http://msdn.microsoft.com/en-us/library/system.diagnostics.process.exited(v=vs.90).aspx – PmanAce

답변

0

클리너 버전이 없으므로 간단히 Dispose 메서드를 호출했습니다.
모든 것이 처리되었습니다 (예 : 폐쇄 된 WCF 서비스).
마지막으로 Process.GetCurrentProcess(). Kill();

1

Environment.Exit() 청소기 아닌가?

+0

감사합니다. 이것은 추가 개발에 유용 할 수 있습니다. – ilansch

관련 문제