C # waitforexit


C # waitforexit
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
Process. WaitForExit (Int32)
지금은 로그를 출력하고 프로세스가 완료 될 때까지 기다리는 다음 코드가있는 Console Runner 응용 프로그램에서 작업하고 있습니다.
이 코드 조각에 대해 두 가지 질문이 있습니다.
프로세스가 30 초 이상 걸리면 호출 p. ExitCode가 폭탄을 터뜨리는 것으로 나타났습니다. 어쨌든 30 초를 기다리거나 과정에 CLR의 조언을 구하는 데 1 초 정도 걸리는 경우 어떻게됩니까?
프로세스가 종료되기 전에 ExitCode를 가져 오려고하면 예외가 throw됩니다. 먼저 연결된 프로세스가 종료되었는지 확인하기 위해 HasExited 속성을 검사하십시오.
WaitForExit에 대한 호출이 반환되면 프로세스가 종료된다는 보장은 없습니다. WaitForExit의 설명서에서 :
WaitForExit (Int32) 오버로드는 연결된 프로세스가 종료 될 때까지 현재 스레드를 대기 상태로 만드는 데 사용됩니다. 이 과부하는 프로세스 구성 요소가 프로세스가 종료 될 때까지 일정한 시간 동안 대기하도록 지시합니다. 종료 요구가 거부되어 관련 프로세스가 간격 종료까지 종료하지 않으면 호출 프로 시저에 false가 리턴됩니다. 밀리 초 단위로 음수 (Infinite)를 지정할 수 있으며 Process. WaitForExit (Int32)는 WaitForExit () 과부하와 동일한 방식으로 작동합니다. 메서드에 0을 전달하면 프로세스가 이미 종료 된 경우에만 true가 반환됩니다. 그렇지 않으면 즉시 false를 반환합니다.
이것은 두 번째 질문에 대한 답입니다. 제한 시간이 경과하기 전에 프로세스가 종료되면 WaitForExit가 리턴됩니다.
유한 제한 시간을 지정 했으므로 프로세스가 완료되기 전에 함수가 리턴 될 수 있습니다. 그래서 다음과 같이 코드를 작성할 수 있습니다.

C # waitforexit
WaitForExit () () () 오버로드는 연결된 프로세스가 종료 될 때까지 현재 스레드를 대기 상태로 만드는 데 사용됩니다. 이 메소드는 Process 구성 요소가 프로세스가 종료 될 때까지 무한한 시간 동안 대기하도록 지시합니다. 이로 인해 응용 프로그램이 응답을 중지 할 수 있습니다. 예를 들어 사용자 인터페이스가있는 프로세스에 대해 CloseMainWindow를 호출하면 프로세스가 메시지 루프를 입력하지 않도록 작성된 경우 연결된 프로세스를 종료하라는 운영 체제의 요청이 처리되지 않을 수 있습니다.
이 과부하는 경로 재 지정된 표준 출력에 대한 비동기 이벤트 처리를 포함하여 모든 처리가 완료되었는지 확인합니다. 표준 출력이 비동기 이벤트 처리기로 리디렉션되었을 때 WaitForExit (Int32) 오버로드를 호출 한 후에이 오버로드를 사용해야합니다.
이것은 물론입니다. Note 프로세스가 끝나기를 기다리지 않는다고 생각하는 이유는 무엇입니까? 그 징후는 무엇입니까? 증거가 뭐죠?
프로세스 p = 새 프로세스 ();
MessageBox. Show (& quot; 이제 브라우저가 종료되어야합니다 & quot;);
당신이 사용할 수있는 프로세스 객체를 얻지 않는다는 것을 제외하고는. 시도하면.
새 프로세스로 Dim myProc ()
myProc = Process. Start ( "iexplore", "finance. yahoo/q/hp? s ="+ symbol);
Microsoft는 Msdn 웹 사이트에 대한 귀하의 의견을 이해하기 위해 온라인 설문 조사를 실시하고 있습니다. 참여를 선택하면 Msdn 웹 사이트를 탈퇴 할 때 온라인 설문 조사가 제공됩니다.

사용 예제.
나는이 방법으로 그것을 해결했다.
나는 입력, 출력 및 오류 모두를 리디렉션하고 출력 및 오류 스트림에서 읽기를 처리했습니다. 이 솔루션은 Windows 7과 Windows 8 모두 SDK 7 - 8.1에서 작동합니다.
Mark Beers, Rob, stevejay 대답을 고려하여 비동기 스트림 읽기를 사용하여 문제를 해결할 클래스를 만들려고했습니다. 그렇게하면 비동기 프로세스 출력 스트림 읽기와 관련된 버그가 있음을 알았습니다.
당신은 그렇게 할 수 없습니다 :
System. InvalidOperationException이 발생합니다 : StandardOut가 리디렉션되지 않았거나 프로세스가 아직 시작되지 않았습니다.
그런 다음 프로세스가 시작된 후 비동기 출력 읽기를 시작해야합니다.
이렇게하면 출력 스트림이 비동기로 설정되기 전에 데이터를받을 수 있기 때문에 경쟁 조건을 만듭니다.
그렇다면 어떤 사람들은 스트림을 비동기로 설정하기 전에 스트림을 읽어야한다고 말할 수 있습니다. 그러나 같은 문제가 발생합니다. 동기 읽기 사이에 경쟁 조건이 있으며 스트림을 비동기 모드로 설정합니다.
"Process"와 "ProcessStartInfo"가 설계된 실제 방식으로 프로세스의 출력 스트림을 안전하게 비동기 적으로 읽는 방법은 없습니다.
다른 사용자가 제안한 것과 같이 비동기 읽기를 사용하는 것이 좋습니다. 그러나 경쟁 조건으로 인해 정보가 누락 될 수 있음을 알고 있어야합니다.
위의 답변 중 하나도 해당 작업을 수행하지 않습니다.
롭 솔루션이 중단되고 'Mark Byers'솔루션이 폐기 된 예외를 얻습니다. (다른 답변의 '솔루션'을 시도했습니다.)
그래서 나는 또 다른 해결책을 제안하기로 결정했다.
이 코드는 디버깅되어 완벽하게 작동합니다.
이것이 간단하고 더 나은 접근 방법입니다 (우리는 AutoResetEvent가 필요 없습니다) :
나는 같은 문제가 있었지만 그 이유는 다르다. 그러나 Windows 8에서는 발생하지만 Windows 7에서는 발생하지 않습니다. 다음 줄이 문제를 일으킨 것으로 보입니다.
해결책은 UseShellExecute를 비활성화하지 않는 것입니다. 원하지 않는 쉘 팝업 창을 받았지만 특별한 일이 일어나지 않을 때까지 기다리는 프로그램보다 훨씬 낫습니다. 그래서 다음과 같은 해결 방법을 추가했습니다.
이제 나를 귀찮게하는 것은 Windows 8에서 왜 이런 일이 일어나고 있는지입니다.
소개.
현재 허용되는 응답이 작동하지 않고 (예외가 throw 됨) 해결 방법이 너무 많지만 완전한 코드가 없습니다. 이것이 대중적인 질문이기 때문에 많은 사람들의 시간을 낭비하는 것은 분명합니다.
Mark Byers의 대답과 Karol Tyl의 대답을 결합하여 Process. Start 메서드를 사용하는 방법을 기반으로 전체 코드를 작성했습니다.
git 명령을 통해 진행 대화 상자를 만드는 데 사용했습니다. 이것이 내가 그것을 사용한 방법입니다 :
이론적으로 stdout과 stderr를 결합 할 수도 있지만 테스트하지는 않았습니다.
나는 이것이 늙다는 것을 알고 있지만이 전체 페이지를 읽은 후에는 해결할 수있는 코드가 없기 때문에 무하마드 레 한 (Muhammad Rehan)을 시도하지는 않았다. . 그것이 완전히 진실하지 않은 경우 작동하지 않는다고 말할 때, 때로는 잘 작동 할 것입니다. EOF 마크 전에 출력의 길이와 관련이 있다고 생각합니다.
어쨌든, 나를 위해 일한 솔루션은 다른 스레드를 사용하여 StandardOutput 및 StandardError를 읽고 메시지를 작성하는 것이 었습니다.
희망이 사람이 도움이되기를 바랍니다, 누가 힘들 수 있다고 생각!
내부 타임 아웃과 생성 된 애플리케이션에 의한 StandardOutput 및 StandardError의 사용으로 인해 다른 솔루션 (EM0를 포함하여)은 여전히 ​​내 애플리케이션에 대해 교착 상태입니다. 여기 나를 위해 일한 것입니다 :
편집 : StartInfo의 초기화를 코드 샘플에 추가했습니다.
이 게시물 어쩌면 구식하지만 난 왜 그것이 일반적으로 끊어지는 주된 원인은 redirectStandardoutput에 대한 스택 오버 플로우 때문이거나 redirectStandarderror가있는 경우입니다.
출력 데이터 또는 오류 데이터가 크기 때문에 무한정 지속되는 동안 정지 시간이 발생합니다.

프로세스. WaitForExit 메소드 ()
API 참조 문서에는 새로운 홈이 있습니다. 새로운 경험을 보려면 docs. microsoft의 API 브라우저를 방문하십시오.
프로세스 구성 요소가 관련 프로세스가 종료 될 때까지 무기한 대기하도록 지시합니다.
어셈블리 : System (System. dll)
대기 설정에 액세스 할 수 없습니다.
프로세스 ID가 설정되지 않았으며 Id 속성을 확인할 수있는 핸들이 없습니다.
이 Process 개체와 연결된 프로세스가 없습니다.
원격 컴퓨터에서 실행중인 프로세스에 대해 WaitForExit () 호출하려고합니다. 이 방법은 로컬 컴퓨터에서 실행중인 프로세스에만 사용할 수 있습니다.
WaitForExit ()은 연결된 프로세스가 종료 될 때까지 현재 스레드를 대기시킵니다. 이 메소드는 다른 모든 메소드가 호출 된 후에 호출되어야합니다. 현재 스레드를 차단하지 않으려면 Exited 이벤트를 사용하십시오.
이 메서드는 Process 구성 요소에 프로세스 및 이벤트 처리기가 종료 될 때까지 무한한 시간 동안 대기하도록 지시합니다. 이로 인해 응용 프로그램이 응답을 중지 할 수 있습니다. 예를 들어 사용자 인터페이스가있는 프로세스에 대해 CloseMainWindow를 호출하면 프로세스가 메시지 루프를 입력하지 않도록 작성된 경우 연결된 프로세스를 종료하라는 운영 체제의 요청이 처리되지 않을 수 있습니다.
Framework 3.5 및 이전 버전에서는 WaitForExit () 오버로드가 무한대가 아닌 MaxValue 밀리 초 (약 24 일) 동안 대기했습니다. 또한 이전 버전에서는 MaxValue 전체 시간에 도달하면 이벤트 처리기가 종료 될 때까지 기다리지 않았습니다.
이 과부하는 경로 재 지정된 표준 출력에 대한 비동기 이벤트 처리를 포함하여 모든 처리가 완료되었는지 확인합니다. 표준 출력이 비동기 이벤트 처리기로 리디렉션되었을 때 WaitForExit (Int32) 오버로드를 호출 한 후에이 오버로드를 사용해야합니다.
연관된 프로세스가 종료 될 때 (즉 정상 또는 비정상 종료를 통해 운영 체제에 의해 종료 될 때) 시스템은 프로세스에 대한 관리 정보를 저장하고 WaitForExit ()을 호출 한 구성 요소로 돌아갑니다. 그런 다음 프로세스 구성 요소는 나가기 프로세스에 대한 핸들을 사용하여 ExitTime을 포함하는 정보에 액세스 할 수 있습니다.
연결된 프로세스가 종료되었으므로 구성 요소의 Handle 속성은 더 이상 기존 프로세스 리소스를 가리 키지 않습니다. 대신 핸들은 프로세스 자원에 대한 운영 체제의 정보에 액세스하는 데에만 사용할 수 있습니다. 시스템은 프로세스 구성 요소가 릴리스하지 않은 종료 프로세스에 대한 핸들을 알고 있으므로 프로세스 구성 요소가 리소스를 특별히 해제 할 때까지 ExitTime 및 핸들 정보를 메모리에 유지합니다. 이러한 이유로, Process 인스턴스에 대해 Start를 호출 할 때마다 연관된 프로세스가 종료되고 더 이상 관리 정보가 필요 없으면 Close를 호출하십시오. 닫기는 종료 된 프로세스에 할당 된 메모리를 해제합니다.
StandardError 속성 참조 페이지의 설명 섹션을 참조하십시오.
즉각적인 호출자에 대한 완전한 신뢰. 이 멤버는 부분적으로 신뢰할 수있는 코드에서 사용할 수 없습니다.

Comments