Thursday 8 February 2018

프로세스 readtoend waitforexit


프로세스 readtoend waitforexit
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
ReadToEnd는 프로세스 및 waitforexit의 std 출력에서 ​​가져옵니다.
새로 만든 프로세스의 stdoutput을 사용하는 MSDN 예제에서 :
myStreamReader. ReadLine () 대신 myStreamReader. ReadToEnd ()를 사용하고 있는데도 myProcess. WaitForExit ()을 사용해야합니까? 또는 ReadToEnd () 프로세스가 완료 될 때까지 기다릴 것입니다?
편집 : 유감스럽게도, 귀하의 질문에 직접 대답을 유감스럽게 생각합니다. 예, Process. WaitForExit ()를 호출해야합니다. . 이렇게하면 ReadToEnd ()를 호출하기 전에 프로세스가 모든 출력을 반환하도록 할 수 있습니다.
ReadToEnd는 동기 함수입니다. 따라서 코드에서 호출하지 않으면 StandardOutput의 첫 번째 출력 만 캡처 할 때까지 주 스레드가 차단됩니다. 그러나 WaitForExit을 사용하면 모든 것을 가질 수 있습니다.
또한 프로세스의 출력을 비동기 적으로 읽는 것을 고려할 수도 있습니다. 이 MSDN 예제에서 OutputDataRecieved를 구현합니다.
"ReadToEnd"는 "StreamReader"개체에 저장된 함수이며 프로세스 종료를 기다리는 것과 관련이 있다고 생각하지 않지만 "프로세스"클래스는 처리 할 수 ​​있습니다. 그건 그렇고, 모든 능력 "StreamReader"당신이 언급 한 상황에서 유용하지 않습니다.
내 관점에서는 "WaitForExit"을 호출해야하며 "닫기"도 수행해야합니다. 그들은 다른 방법으로는 할 수없는 시스템 자원을 공개 할 것이기 때문입니다. 필자가 아는 한, "ReadToEnd"메서드는이 두 메서드를 호출하는 것과 아무런 관련이 없습니다.

월터의 통나무.
. 학습하면서 글쓰기.
2011 년 11 월 18 일 금요일.
Process. WaitForExit (Int32) 문제가 발생합니다.
보시다시피, 코드는 "cmd. exe"프로세스를 시작하고 실행하려는 명령을 전달합니다.
코드에서 ping - t 8.8.8.8 명령을 사용했습니다. - t 옵션으로 인해 호스트를 멈추지 않고 ping합니다. 무슨 일이야? ping - t 명령과 함께 "cmd. exe"프로세스는 절대로 종료되지 않고 stdout 스트림을 닫지 않으므로 코드가 Output = process. StandardOutput. ReadToEnd (); 왜냐하면 모든 스트림을 읽는 데 성공하지 못하기 때문입니다.
배치 파일의 명령이 어떤 이유로 든 중단되고 위의 코드가 계속해서 몇 년 동안 작동 한 다음 명백한 이유없이 갑자기 멈추는 경우에도 마찬가지입니다.
"cmd. exe"에 첨부하는 명령이나 호출중인 프로세스가 표준 출력이나 표준 오류를 채우면 교착 상태가 발생할 수 있습니다. 이것은 코드가 라인에 도달 할 수 없기 때문입니다.
실제로 우리 프로그램이 스트림의 채워진 버퍼를 읽지 않는다면 자식 프로세스 (ping 명령이나 배치 파일 또는 실행중인 모든 프로세스)를 실행할 수 없습니다. 코드가 프로세스가있는 줄에 매달려 있습니다. WaitForExit () : 자식 프로젝트가 종료 될 때까지 기다립니다.
두 스트림의 기본 크기는 4096 바이트입니다. 다음 배치 파일을 사용하여이 두 가지 크기를 테스트 할 수 있습니다.

여보. 자비.
또 다른 WordPress 사이트.
[] 해결책 : WaitForExit은 Process. Start () 후에 실행하지 마십시오.
Process. Start ()가 호출 된 후 WaitForExit가 실행되지 않습니다.
프로세스가 표준 스트림에 텍스트를 쓰면 해당 텍스트는 일반적으로 콘솔에 표시됩니다. StandardOutput 스트림을 리디렉션하면 프로세스의 출력을 조작하거나 억제 할 수 있습니다. 예를 들어, 텍스트를 필터링하거나, 다르게 형식을 지정하거나, 콘솔과 지정된 로그 파일에 출력을 쓸 수 있습니다.
리디렉션 된 StandardOutput 스트림은 동 기적 또는 비동기 적으로 읽을 수 있습니다. Read, ReadLine 및 ReadToEnd와 같은 메서드는 프로세스의 출력 스트림에 대한 동기 읽기 작업을 수행합니다. 이러한 동기 읽기 작업은 연결된 Process가 해당 StandardOutput 스트림에 쓰거나 스트림을 닫을 때까지 완료되지 않습니다.
반대로 BeginOutputReadLine은 StandardOutput 스트림에서 비동기 읽기 작업을 시작합니다. 이 메서드는 스트림 출력에 지정된 이벤트 처리기를 활성화하고 호출자에게 즉시 반환합니다. 호출자는 스트림 출력이 이벤트 처리기로 전달되는 동안 다른 작업을 수행 할 수 있습니다.
동기 읽기 작업은 호출자가 StandardOutput 스트림에서 읽는 것과 해당 스트림에 쓰는 하위 프로세스간에 종속성을 도입합니다. 이러한 종속성으로 인해 교착 상태가 발생할 수 있습니다. 호출자가 하위 프로세스의 리디렉션 된 스트림에서 읽으면 자식에 종속됩니다. 호출자는 자식이 스트림에 쓰거나 스트림을 닫을 때까지 읽기 작업을 기다립니다. 하위 프로세스가 리디렉션 된 스트림을 채우기에 충분한 데이터를 쓰면 부모 프로세스에 종속됩니다. 자식 프로세스는 부모가 전체 스트림을 읽거나 스트림을 닫을 때까지 다음 쓰기 작업을 기다립니다. 교착 s 태는 호출자와 하위 프로세스가 조작을 완료하기 위해 서로 대기하고 둘 다 진행할 수 없게됩니다. 호출자와 하위 프로세스 간의 종속성을 평가하여 교착 상태를 피할 수 있습니다.
예를 들어 다음 C # 코드는 리디렉션 된 스트림에서 읽는 방법과 자식 프로세스가 종료 될 때까지 기다리는 방법을 보여줍니다.
이 코드 예제에서는 p. WaitForExit 앞에 p. StandardOutput. ReadToEnd를 호출하여 교착 상태를 방지합니다. 부모 프로세스가 p. StandardOutput. ReadToEnd 전에 p. WaitForExit를 호출하고 자식 프로세스가 리디렉션 된 스트림을 채우기에 충분한 텍스트를 쓰는 경우 교착 상태가 발생할 수 있습니다. 부모 프로세스는 자식 프로세스가 종료 될 때까지 무기한 대기합니다. 하위 프로세스는 부모가 전체 StandardOutput 스트림에서 읽을 수 있도록 무기한 대기합니다.
표준 출력 스트림과 표준 오류 스트림 모두에서 모든 텍스트를 읽을 때도 비슷한 문제가 발생합니다. 예를 들어 다음 C # 코드는 두 스트림 모두에서 읽기 작업을 수행합니다.
이 코드 예제는 StandardOutput 스트림에서 비동기 읽기 작업을 수행하여 교착 상태를 방지합니다. 교착 상태 조건은 부모 프로세스가 p. StandardOutput. ReadToEnd 다음에 p. StandardError. ReadToEnd를 호출하고 자식 프로세스가 오류 스트림을 채우기에 충분한 텍스트를 쓰면 발생합니다. 부모 프로세스는 자식 프로세스가 StandardOutput 스트림을 닫을 때까지 무기한 대기합니다. 자식 프로세스는 부모가 전체 StandardError 스트림에서 읽을 수 있도록 무기한 대기합니다.
비동기 읽기 조작을 사용하여 이러한 종속성 W 교착 s 태 가능성을 피할 수 있습니다. 또는 두 개의 스레드를 만들고 각 스레드의 출력을 별도의 스레드에서 읽음으로써 교착 상태를 피할 수 있습니다.
관련.
소식 탐색.
회신을 남겨주 답장을 취소하십시오.
모든 신체는 어떻게되는지, 이 웹 로그를 처음 보게됩니다. 이 웹 페이지에는 방문객을 지원하는 멋진 데이터가 포함되어 있습니다.

사용 예제.
나는이 방법으로 그것을 해결했다.
나는 입력, 출력 및 오류 모두를 리디렉션하고 출력 및 오류 스트림에서 읽기를 처리했습니다. 이 솔루션은 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가있는 경우입니다.
출력 데이터 또는 오류 데이터가 크기 때문에 무한정 지속되는 동안 정지 시간이 발생합니다.

No comments:

Post a Comment