C # redirectstandardoutput waitforexit
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를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
Process. start : 출력을 얻는 방법?
내 Mono / app에서 외부 명령 줄 프로그램을 실행하고 싶습니다. 예를 들어, mencoder를 실행하고 싶습니다. 가능한가?
커맨드 라인 쉘 출력을 내 텍스트 상자에 써주시겠습니까? 시간 경과와 함께 진행률 표시 줄을 나타내는 수치 값을 얻으려면?
Process 개체를 만들 때 StartInfo를 적절하게 설정합니다.
다음 프로세스를 시작하고 그것에서 읽을 :
int. Parse () 또는 int. TryParse ()를 사용하여 문자열을 숫자 값으로 변환 할 수 있습니다. 읽은 문자열에 유효하지 않은 숫자가있는 경우 먼저 문자열 조작을해야 할 수도 있습니다.
출력을 동 기적 또는 비동기 적으로 처리 할 수 있습니다.
출력과 오류를 모두 처리하는 것이 더 좋습니다. 개별적으로 처리해야합니다.
(*) 일부 명령 (여기서는 StartInfo. Arguments)에 / c 지시문을 추가해야합니다. 그렇지 않으면 WaitForExit ()에 프로세스가 고정됩니다.
출력과 관련하여 복잡한 연산을 수행 할 필요가없는 경우 핸들러를 직접 인라인에 추가하기 만하면 OutputHandler 메소드를 무시할 수 있습니다.
이 작업을 수행하는 표준 방법은 Process 'StandardOutput 스트림에서 읽는 것입니다. 연결된 MSDN 문서에는 예제가 있습니다. 마찬가지로 StandardError에서 읽고 StandardInput에 쓸 수 있습니다.
좋아, 오류 및 출력 모두 읽기를 원하지만 다른 솔루션 (나와 같은)에서 제공되는 솔루션 중 하나에서 교착 상태가 발생하는 사람은 StandardOutput 속성에 대한 MSDN 설명을 읽은 후 솔루션을 작성했습니다.
답은 T30의 코드를 기반으로합니다 :
당신은 2 개의 프로세스가 공유하는 메모리를 사용하여 통신 할 수 있습니다. MemoryMappedFile을 체크 아웃하십시오.
당신은 주로 "using"문을 사용하여 부모 프로세스에 mmf 파일을 매핑 한 다음 종료 될 때까지 두 번째 프로세스를 만들고 BinaryWriter를 사용하여 mmf에 결과를 쓴 다음 부모 프로세스를 사용하여 mmf에서 결과를 읽습니다. , 명령 줄 인수를 사용하여 mmf 이름을 전달하거나 하드 코드 할 수도 있습니다.
부모 프로세스에서 매핑 된 파일을 사용할 때 매핑 된 파일이 부모 프로세스에서 해제되기 전에 자식 프로세스에서 매핑 된 파일에 결과를 기록해야합니다.
예 : 상위 프로세스.
이 샘플을 사용하려면 내부에 2 개의 프로젝트가있는 솔루션을 생성 한 다음 % childDir % / bin / debug에서 하위 프로세스의 빌드 결과를 가져 와서 % parentDirectory % / bin / debug에 복사 한 다음 부모 프로젝트
childDir 및 parentDirectory는 PC의 행운을 빌어 프로젝트의 폴더 이름입니다. :)
이것은 mencoder에 의존합니다. 명령 줄에서이 상태를 출력하면 예 :)
C # redirectstandardoutput waitforexit
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
StandardOutput. ReadToEnd ()가 응답하지 않음 [duplicate]
이 질문에는 이미 답변이 있습니다.
외부 프로그램을 자주 사용하고 출력을 읽는 프로그램이 있습니다. 그것은 당신의 일반적인 프로세스 리다이렉트 출력을 사용하여 꽤 잘 작동하지만, 어떤 이유로 든 하나의 특정 인수가 읽히려고 할 때 오류 메시지가 나타나지 않습니다. 예외도없고, 그 행에 도달하면 멈추게됩니다. 물론 프로그램의 출력을 호출하고 읽는 중앙 집중식 함수를 사용합니다. 이 함수는 다음과 같습니다.
중단되는 줄은 result = proc. StandardOutput. ReadToEnd (); , 그러나 매번 다시는 아니며 특정 인수 ( "start-server")를 보낸 경우에만 사용됩니다. 다른 모든 인수는 잘 작동합니다. 값을 읽고 반환합니다. 그것은 또한 이상한 방식으로 달려있다. 정지되거나 오류가 발생하지 않으며 처리가 중지됩니다. 마치 'return'명령 인 것처럼, 호출 함수로 복귀하지 않는다는 것을 제외하고는 인터페이스가 계속 실행중인 상태에서 모든 것을 중지합니다. 누구든지 전에 이것을 경험 했습니까? 누구든지 내가 뭘 시도해야하는지 알지? 스트림 자체 내에서 예상치 못한 일이 발생했다고 가정하고 있지만 처리 할 수있는 방법이 있습니까 / 무시해도 어쨌든 읽을 수 있습니까?
Peter Duniho에 의해 중복으로 표시됨 c # C # 배지가있는 사용자는 단독으로 C # 질문을 중복으로 닫고 필요에 따라 다시 열 수 있습니다. 6 월 27 일 2:45
이 질문은 전에 질문을 받았고 이미 답변이 있습니다. 이러한 답변으로 귀하의 질문에 완전히 답변하지 못하면 새로운 질문을하십시오.
BeginOutputReadLine ()을 사용한 제안 된 솔루션은 좋은 방법이지만 상황 (예 : WaitForExit ()을 사용하여 확실히)이 비동기 출력보다 먼저 종료되기 때문에 프로세스가 완전히 종료되기 때문에 적용 할 수 없습니다.
그래서, 그것을 동 기적으로 구현하려고하고 솔루션이 StreamReader 클래스의 Peek () 메서드를 사용하고 있음을 발견했습니다. Peek () & gt; -1 MSDN 기사에서 설명한대로 스트림의 끝이 아님을 확인하고 마침내 멈추고 정지합니다!
다음은 코드입니다.
문제는 StandardOutput 및 StandardError 스트림 모두에서 동기 ReadToEnd 메서드를 사용하고 있다는 것입니다. 이로 인해 발생할 수있는 교착 상태가 발생할 수 있습니다. 이것은 MSDN에도 설명되어 있습니다. 해결책이 설명되어 있습니다. 기본적으로 비동기 버전 인 BeginOutputReadLine을 사용하여 StandardOutput 스트림의 데이터를 읽습니다.
교착 상태 문제가 발생했습니다. 이 코드 스 니펫이 나를 위해 일했습니다.
무엇과 같은 것 :
오류가 그냥 걸려 있었던 것과 같은 종류의 문제가있었습니다.
다니엘 힐가스 (Daniel Hilgarth)에 대한 귀하의 답변을 토대로, 저들이 나를 위해 일했을 것이라고 생각 하긴하지만 나는 그 코드를 사용하려고 시도조차하지 않았습니다.
이후 내가 할 수 있기를 원하는 몇 가지 더 멋진 결과물은 결국 나는 두 가지 출력을 백그라운드 스레드에서 수행하는 것으로 결정할 것입니다.
이것은 나를 위해 일했고 내가 읽을 시간 초과를 사용할 필요가 없도록했습니다.
우아하고 나를 위해 일하는 것이 있습니다 :
이 대답과 트릭은 표준 입력에서 Flush () 및 Close ()를 사용하고 있습니다.
수락 된 대답의 해결책이 나에게 도움이되지 못했습니다. 교착 상태를 피하기 위해 작업을 사용해야했습니다.
다음과 같이 GetStreamOutput 함수를 사용합니다.
Windows Forms 및 TextBox (또는 RichTextBox)를 사용하여 오류를 표시하고 프로세스가 실시간으로 반환하도록하는 동안 (예 : process. StandardOutput / process. StandardError) 쓰여지는 동안 누군가이 질문에 비틀 거립니다.
교착 상태없이 두 스트림을 읽으려면 OutputDataReceived () / ErrorDataReceived ()를 사용해야합니다. 다른 방법으로는 교착 상태를 피하기위한 방법이 없습니다. Fedor의 대답은 이제 "Answer"태그와 가장 좋아하는 데이트, 나를 위해 트릭을하지 않습니다.
그러나 RichTextBox (또는 TextBox)를 사용하여 데이터를 출력 할 때 발생하는 또 다른 문제는 데이터를 실제 시간 (실제로 도착하면)에 실제로 텍스트에 쓰는 방법입니다. 백그라운드 스레드 OutputDataReceived () / ErrorDataReceived () 중 하나에있는 데이터에 대한 액세스 권한을 가지며 주 스레드에서만 AppendText () 만 사용할 수 있습니다.
내가 처음 시도한 것은 process. Start ()를 백그라운드 스레드에서 호출 한 다음 BeginInvoke () => gt; 메인 스레드가 process. WaitForExit () 동안 AppendText () OutputDataReceived () / ErrorDataReceived () 스레드.
그러나, 이것은 영원을 위해 궁극적으로 궁지에 몰려 들고 얼어 붙었습니다. 노력의 며칠 후에 나는 아래의 해결책으로 끝났다. 그것은 꽤 잘 작동하는 것처럼 보인다.
간단히 말하면, 메인 쓰레드가 지속적으로 그 콜렉션으로부터 메시지를 추출하여 텍스트 박스에 추가하려고 시도하는 동안, OutputDataReceived () / ErrorDataReceived () 쓰레드 내에서 동시 콜렉션에 메시지를 추가해야한다.
사용 예제.
나는이 방법으로 그것을 해결했다.
나는 입력, 출력 및 오류 모두를 리디렉션하고 출력 및 오류 스트림에서 읽기를 처리했습니다. 이 솔루션은 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가있는 경우입니다.
출력 데이터 또는 오류 데이터가 크기 때문에 무한정 지속되는 동안 정지 시간이 발생합니다.
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
Process. start : 출력을 얻는 방법?
내 Mono / app에서 외부 명령 줄 프로그램을 실행하고 싶습니다. 예를 들어, mencoder를 실행하고 싶습니다. 가능한가?
커맨드 라인 쉘 출력을 내 텍스트 상자에 써주시겠습니까? 시간 경과와 함께 진행률 표시 줄을 나타내는 수치 값을 얻으려면?
Process 개체를 만들 때 StartInfo를 적절하게 설정합니다.
다음 프로세스를 시작하고 그것에서 읽을 :
int. Parse () 또는 int. TryParse ()를 사용하여 문자열을 숫자 값으로 변환 할 수 있습니다. 읽은 문자열에 유효하지 않은 숫자가있는 경우 먼저 문자열 조작을해야 할 수도 있습니다.
출력을 동 기적 또는 비동기 적으로 처리 할 수 있습니다.
출력과 오류를 모두 처리하는 것이 더 좋습니다. 개별적으로 처리해야합니다.
(*) 일부 명령 (여기서는 StartInfo. Arguments)에 / c 지시문을 추가해야합니다. 그렇지 않으면 WaitForExit ()에 프로세스가 고정됩니다.
출력과 관련하여 복잡한 연산을 수행 할 필요가없는 경우 핸들러를 직접 인라인에 추가하기 만하면 OutputHandler 메소드를 무시할 수 있습니다.
이 작업을 수행하는 표준 방법은 Process 'StandardOutput 스트림에서 읽는 것입니다. 연결된 MSDN 문서에는 예제가 있습니다. 마찬가지로 StandardError에서 읽고 StandardInput에 쓸 수 있습니다.
좋아, 오류 및 출력 모두 읽기를 원하지만 다른 솔루션 (나와 같은)에서 제공되는 솔루션 중 하나에서 교착 상태가 발생하는 사람은 StandardOutput 속성에 대한 MSDN 설명을 읽은 후 솔루션을 작성했습니다.
답은 T30의 코드를 기반으로합니다 :
당신은 2 개의 프로세스가 공유하는 메모리를 사용하여 통신 할 수 있습니다. MemoryMappedFile을 체크 아웃하십시오.
당신은 주로 "using"문을 사용하여 부모 프로세스에 mmf 파일을 매핑 한 다음 종료 될 때까지 두 번째 프로세스를 만들고 BinaryWriter를 사용하여 mmf에 결과를 쓴 다음 부모 프로세스를 사용하여 mmf에서 결과를 읽습니다. , 명령 줄 인수를 사용하여 mmf 이름을 전달하거나 하드 코드 할 수도 있습니다.
부모 프로세스에서 매핑 된 파일을 사용할 때 매핑 된 파일이 부모 프로세스에서 해제되기 전에 자식 프로세스에서 매핑 된 파일에 결과를 기록해야합니다.
예 : 상위 프로세스.
이 샘플을 사용하려면 내부에 2 개의 프로젝트가있는 솔루션을 생성 한 다음 % childDir % / bin / debug에서 하위 프로세스의 빌드 결과를 가져 와서 % parentDirectory % / bin / debug에 복사 한 다음 부모 프로젝트
childDir 및 parentDirectory는 PC의 행운을 빌어 프로젝트의 폴더 이름입니다. :)
이것은 mencoder에 의존합니다. 명령 줄에서이 상태를 출력하면 예 :)
Comments
Post a Comment