이 질문은 전에 한 번 이상 물어 본 질문이지만 만족스런 답변을 찾지 못했습니다.Process.StandardOutput에서 출력 버퍼링을 사용하지 않도록 설정하는 방법
나는 대략 매초마다 새로운 결과를 산출하는 STDOUT에 순간 측정을 생성하는 명령 행 과정을 시작하고있다. System.Diagnostics.Process.StandardOutput을 사용하면 STDOUT 데이터가 Process.StandardOutput StreamReader의 4k 버퍼를 통해 작동하기 때문에 완전히 받아 들일 수없는 지연 (20 초 이상)이 발생합니다.이 문제를 해결할 방법이없는 것 같습니다.
Calling Process.StandardOutput.BaseStream.Flush()가 작동하지 않습니다.
Process.StandardOutput에 대해 바이트 단위로 동기 읽기를 시도했지만 실제 출력보다 4k가 남았습니다.
적어도 나를 확인하면 STDOUT을 리디렉션하는 것과 관련된 모든 버퍼링 문제를 극복 할 수 있으며 쉘 창에 나타나 자마자 응용 프로그램에서 데이터를받을 수 있습니까? Process 클래스에서 상속 받고 StandardOutput 스트림 판독기가 작동하는 방식을 변경할 수 있습니까? 원시 WINAPI 호출을 조사해야합니까?
아무튼,이 작업을 수행해야합니다. 결국 관리되지 않는 C++로 작업을 시작하고 결과물을 소비하고 링크하는 경우에도 마찬가지입니다. 도움이 될만한 점이 많습니다. 나는 지혜 끝에 ...
편집 : 내가 필요로하는 것은 C/C++, Perl, Python 및 Java에서 사용할 수있는 "expect"라이브러리의 .Net 구현입니다. 내가 지금까지 발견 한 유일한 것들). 그런 짐승이 있는지 누가 알겠습니까?
이 질문에 대한 좋은 답변을 얻지 못했습니다 ... –
예. 나는 외부 명령에 대한 소스 코드를 얻고, 명시적인 STDOUT 버퍼 플러시로 다시 컴파일했다. 그래도 여전히 원래의 문제를 해결하고 싶습니다. 나는 .Net Expect 구현을 직접 작성했지만, 외부 도구를 다시 컴파일하는 것은 내 상사가 내게 소리 지르는 것을 피하는 더 좋은 방법 인 것처럼 보였다. –
나는 같은 문제로 어려움을 겪고있다. 별도의 스레드 (또는 stderr 실제로 2 : 1, stdout 1) 콘솔 출력을 읽고 있어요. 결과적으로 StandardOutput은 'Peek'와 같은 호출을 사용할 때만 버퍼링을합니다.이 프로세스에서는 -1을 반환합니다. 단순히 1 바이트로'ReadLine'이나'Read'를 사용하면, 잘 작동 할 것이고 버퍼링에 문제가 없을 것입니다. – atlaste