2009-05-29 7 views
0

외부 명령 줄 유틸리티를 실행하고 표준 출력 (PNG 이미지)을 읽는 프로그램이 있습니다. 원래 테스트 중에 명령 줄 프로그램에서 이미지를 임시 파일을 만들고 프로그램에 파일을로드합니다. Exit 코드가 0이 아니면 예외를 던진 Process.Exited에 대한 처리기가 있습니다. 임시 이미지를로드하기 전에 WaitForExit을 호출하여 프로세스가 완료되었는지 확인했습니다. 예외가 발생하면 임시 이미지 파일을 읽는 코드에서 예외가 처리됩니다. 이제 오류가없는 경우 잘 작동하는 Process.Start를 호출 한 직후 이미지 파일을 만드는 호출을합니다. 외부 프로그램이 비정상적으로 종료되면 exit 핸들러가 던진 예외가 더 이상 내 코드에 걸리지 않습니다. 표준 출력을 읽기 전에 WaitForExit을 호출하면 프로그램이 중단됩니다. WaitForExit 호출하지 않고 종료 처리기에 의해 throw 된 예외를 잡을 수있는 방법이 있습니까?Process.Exited 처리기에서 예외를 throw하는 중

답변

0

당신이 명령 줄 유틸리티 프로그램처럼 나에게 소리가 제대로 종료되지 않습니다. 프로세스 창을 통해 잘못된 것을보고 있는지 확인해 보셨습니까?

표준 출력을 읽지 않는 것이 프로그램을 종료시키지 않는 것입니다 (출력을 지울 수있을 때까지 기다리는 중입니다). 따라서 표준 출력을 먼저 읽고 그 다음에 유틸리티를 기다려야합니다. 중지.

+0

예기치 않게 종료됩니다 (Process.Exited의 처리기가 0이 아닌 종료 코드를보고 예외를 throw 함). 문제는 처리기에서 throw 된 예외를 catch 할 수 없다는 것입니다. – pschorf

+0

@pschorf, 아 - ​​이해합니다. Process.Exited 처리기의 예외를 변수에 저장하고이를 사용할 수 있습니까? 예를 들어 프로세스가 종료 될 때까지 기다렸다가 throw하는 것일 수 있습니까? – Thies

0

Process.Exited 처리기는 프로세스를 시작하는 함수와 별도의 컨텍스트에서 실행 중입니다. 이 두 가지 방법으로 문제를 해결할 수 있습니다.

  1. 프로세스를 시작한 후 루프를 작성하십시오. (프로세스의 핸들을 사용하여 루프 내에서 WaitOne (100)을 호출하십시오. 예외가 발생하면 핸들이 사라지고 프로세스가 완료된 것처럼 행동해야합니다. 예외가 발생하지 않으면 true를 나타냅니다 프로세스가 닫혔습니다.)
  2. 프로세스를 시작하기 전에 Reset()하는 ManualResetEvent를 만듭니다. 프로세스를 시작한 후 해당 이벤트에 대해 WaitOne()을 호출하십시오. Process.Exited 처리기에서 Set() 해당 이벤트 및 main 메서드를 계속합니다.
+0

두 번째 제안을 구현하려고했습니다. 그것은 제대로 스레드를 차단하지만, try ... catch 블록에 의해 예외가 여전히 처리되지 않았습니다. 여기서 process.start와 waitone을 호출했습니다. 첫 번째 제안을 자세히 설명해 주시겠습니까? – pschorf

+0

호출 코드에서 예외를 catch하려면 예외 자체를 공유 변수에 저장해야합니다. 그런 다음 Set() 이벤트는 주 스레드의 코드에 예외 변수를 확인하도록 지시합니다. null 인 경우 계속 진행하십시오. 그것이 null이 아니면 던져주세요. –

관련 문제