Wednesday 14 February 2018

C # 프로세스 redirectstandardoutput waitforexit


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

C # 프로세스 redirectstandardoutput waitforexit
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
ProcessStartInfo WaitForExit 시간 초과입니다.
ProcessStartInfo를 사용하여 pdf 파일을 인쇄해야합니다.
파일 이름과 인수는 cmd에 붙여 넣을 때 올바르게 작동합니다. 코드는 제대로 작동하지만 Process. Start 다음에는 WaitForExit을 시작하면 프로그램이 완료되지 않습니다. 시간 초과 오류가 발생했습니다.
System. Threading. ThreadAbortException : 스레드가 중단되었습니다. System. Threading. WaitHandle. InternalWaitOne (SafeHandle waitableSafeHandle, Int64 millisecondsTimeout, 부울 hasThreadAffinity, 부울 exitContext)에서 System. Diagnostics. Process. WaitForExit에서 System. Threading. WaitHandle. WaitOneNative (SafeHandle waitableSafeHandle, UInt32 millisecondsTimeout, 부울 hasThreadAffinity, 부울 exitContext) (Int32 밀리 초).
& lt; httpRuntime executionTimeout = "300"/ & gt; 설정과 같은 몇 가지 사항을 검색하고 시도해 보았습니다. process. aitForExit (6000);을 사용하여 코드에서 500이나 같은 코드를 실행하십시오. 예외는 없지만 아무 것도 인쇄되지 않은 곳에서는 더 높습니다.
오류가 있습니까, 아니면 뭔가 빠졌습니까?
편집 : 위의 내 코드 블록을 변경했습니다. 이제 코드는 디버그 모드에서 작동하지만 게시 될 때 내 문서를 인쇄하지 않습니다. 나는 또한 다른 사용자를 사용하려고 시도했다. 디버그 모드에서 코드는 문서를 인쇄하지만 kill 쿼리에서 실행됩니다.
ProcessStartInfo. Verbs는 인수 예외를 반환하지만 이유를 모르겠습니다.
많은 노력, 테스트 및 검색을 한 후에 내 코드가 작동한다고 확신합니다. 그래서 아직도 내 코드가 작동을 멈춘 이유를 모르겠다. 그러나 서버의 Adobe Reader 9.0에서 7.0으로 변경하면 이제 작동합니다.
Adobe Reader 9.0으로 로컬 디버깅을 할 때도 제대로 작동 했으므로 웹 서버에 업데이트가있을 수 있습니다. 나는 그것을 아직 검증하지 않았다.

C # 프로세스 redirectstandardoutput waitforexit
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
어떻게 프로세스를 생성하고 STDOUT을 캡처합니까? [복제]
이 질문에는 이미 답변이 있습니다.
콘솔 응용 프로그램 인 자식 프로세스를 생성하고 출력을 캡처해야합니다.
메서드에 대한 다음 코드를 작성했습니다.
그러나 이것은 아무것도 리턴하지 않습니다. OutputDataReceived 이벤트가 다시 호출되는 것을 믿지 않거나 WaitForExit () 명령이 결코 콜백을하지 않도록 스레드를 차단할 수 있습니다.
편집 : 콜백 너무 열심히 노력했다 것 같습니다. 하기:
잘 작동하는 것처럼 보입니다.
Lusu Vĩnh Ph # c, poke c #에 의해 중복으로 표시됨 C # 배지가있는 사용자는 C # 질문을 단독으로 닫고 필요에 따라 다시 열 수 있습니다. 10 월 17 일 16시 10 분 58 초.
이 질문은 전에 질문을 받았고 이미 답변이 있습니다. 이러한 답변으로 귀하의 질문에 완전히 답변하지 못하면 새로운 질문을하십시오.
작동하도록 확인한 코드는 다음과 같습니다. 나는 MSBuild를 생성하고 출력을 듣기 위해 그것을 사용합니다 :
방금이 작업을 시도했고 다음 작업이 저에게 효과적이었습니다.
두 줄의 순서가 틀린 것 같습니다. 출력을 캡처하기 위해 이벤트 핸들러를 설정하기 전에 프로세스를 시작하십시오. 이벤트 처리기를 추가하기 전에 프로세스가 완료 될 수도 있습니다.
이렇게 선을 전환하십시오.
stdout과 stderr를 캡쳐해야하고 프로세스가 예상대로 종료되지 않으면 시간 초과가 필요했습니다. 나는 이것을 생각해 냈다.
나는 stdout과 stderr를 같은 문자열에 파이핑하고 있지만 필요할 경우 별도로 유지할 수 있습니다. 그것은 이벤트를 사용하기 때문에 그들이 올 때 그것을 처리해야합니다 (저는 믿습니다). 이 작업을 성공적으로 수행했으며 곧 볼륨 테스트를 수행 할 것입니다.
이를 수행하기위한 완전하고 간단한 코드가 있습니다. 내가 이것을 사용했을 때 이것은 효과가 있었다.
이 옵션은 표준 출력만을 캡처합니다. 표준 오류를 포착하지 않습니다. 둘 다 원할 경우이 기술을 각 스트림에 사용하십시오.
StartInfo를 설정 한 후에 실제로 프로세스를 실행하려면 p. Start ()를 호출해야합니다. 사실 프로세스가 실제로 시작된 적이 없으므로 함수가 WaitForExit () 호출에 매달려 있습니다.
스트림 리디렉션은 비동기 적이며 프로세스가 종료 된 후에도 계속 진행됩니다. Umar가 프로세스 종료 프로세스 후 취소하도록 언급했습니다. CancelOutputRead (). 그러나 데이터 손실 가능성이 있습니다.
이것은 나를 위해 안정적으로 작동합니다 :
이 방법을 시도하지는 않았지만 Sly의 제안을 좋아합니다.
다음은 프로세스를 실행하는 데 사용하는 메서드이며 출력 및 오류를 가져옵니다.
첫 번째 BeginOutputReadLine () 후에 응용 프로그램이 종료되었으므로 Judah의 대답이 나에게 적합하지 않거나 완료되지 않았습니다.
이것은 나를 위해 완벽한 조각으로, 핑의 지속적인 출력을 읽고 작동합니다 :

C # 프로세스 redirectstandardoutput waitforexit
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
c # ProcessStartInfo. Start - 출력을 읽지 만 시간 초과가 있습니다.
다른 프로세스를 시작하고 끝내기 위해 대기 (제한 시간이 있음)하려면 MSDN에서 다음을 사용할 수 있습니다.
다른 프로세스를 시작하고 출력을 읽으려면 다음 패턴을 사용할 수 있습니다 (SO에서)
어떻게 두 가지를 결합하여 모든 입력을 읽고 교착 상태에 빠지지 않고 실행중인 프로세스가 잘못되면 시간 초과가 발생합니까?
이 기술은 출력 버퍼가 4KB 이상의 데이터로 채워지는 경우 중지됩니다. 더 확실한 방법은 출력 스트림에 무언가가 기록 될 때 알림을받을 대리자를 등록하는 것입니다. 다른 게시물에서 이미이 방법을 제안했습니다.
두 클래스를 결합 할 필요는 없습니다. Process 클래스는 출력이 StandardOutput - OutputDataReceived로 보내질 때 발생하는 이벤트를 가지고 있습니다.
이벤트에 가입하면 도착한대로 출력물을 읽을 수있게되며, 메인 프로그램 루프에서 시간 초과를 할 수 있습니다.
첫 번째 메소드를 이와 같이 수정할 수 있습니다.
다음과 같이 APM을 사용할 수도 있습니다.
ReadToEnd 호출에 대한 대리자를 정의합니다.
그런 다음 대리인을 사용하여 다음과 같은 메서드를 호출합니다.
편집 : 오류 처리가 명확하게 제거되었습니다.
WaitForExit () 호출 아래 첫 번째 예제의 모든 것을 두 번째 예제에 추가하기 만하면됩니다.

No comments:

Post a Comment