시스템 진단 프로세스 waitforexit 예제


System. diagnostics. process. waitforexit 예
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
WaitforExit이 제대로 작동하지 않습니다.
그래서 나는 잠시 동안이 문제에 대해 싸워 왔으며 그것을 해결하기위한 여러 가지 방법을 시도했지만 그렇게 할 수는 없었습니다.
Bascally waht 내 애플 리케이션은 자바 파일을 호출하여 디바이스에 애플리케이션을로드한다. 로드하는 동안 그것을 richtext 상자에 인쇄하고, 다음 파일로 이동하고 싶습니다. 내가 겪고있는 문제는 첫 번째 파일이로드되는 동안 2 번째 문제를로드하려고 시도한다는 것입니다. 나가기를 기다렸지 만 그렇게하면 출력 데이터가 서식있는 텍스트 상자에 쓰여지지 않습니다. 어떤 아이디어?
나는 여러 다른 장소에서 출구 기다림을 시도했지만 작동하지 않는 것 같습니다.
아래의 두 가지 방법은 stdout 또는 error를 richtext 필드에 씁니다.
어떤 아이디어라도 좋을 것입니다. Bascally 끝내려면 프로세스가 필요하므로 forloop이 다음 파일을로드하는 것으로 계속 생각할 수 있습니다.
WaitForExit을 사용하면 프로세스가 종료 될 때까지 응용 프로그램이 대기 (대기)합니다. 이는 UI 스레드에서 Windows 메시지를 처리 ​​할 수 ​​없으므로 UI를 업데이트하지 않음을 의미합니다.
"백그라운드에서"프로세스를 시작해야 UI가 계속 새로 고침됩니다. 이 작업은 다음을 사용하여 수행 할 수 있습니다.
별도의 스레드에서 프로세스를 시작하고 모니터하고 진행 상황 정보를 UI 스레드로 다시 전달하여 표시합니다. 프로세스 처리 이벤트에 이벤트 처리기를 추가하거나 프로세스를 주기적으로 폴링합니다. HasExited 플래그를 사용하여 첫 번째 프로세스의 상태를 확인합니다 끝마친. 이벤트 처리기는이 프로세스를 시작한 다음 기본 응용 프로그램 루프로 다시 나가서 외부 프로세스가 완료 될 때까지 기다리는 동안 정상적으로 실행되도록합니다.
완료 될 때까지 바쁜 대기 루프에 앉아 애플리케이션 이벤트를 처리하십시오. (이 코드에 대한 재 호출 호출을 유발하는 모든 이벤트는 매우 나쁜 작업을 수행 할 수 있으므로 일반적으로이 방법을 사용하면 나머지 응용 프로그램을 알고있는 상태에서 "잠겨"있는지 확인해야합니다 프로세스가 완료되기를 기다리는 중입니다). 이것은 효과적으로 WaitForExit이하는 일이지만 응용 프로그램 이벤트도 처리하므로 UI가 막연하게 응답 할 수 있습니다.
나는 여기에서 완전히 틀릴지도 모른다.
-jar 뒤에 공백이 있어야합니다.
그렇지 않으면 Java가 즉시 폭탄을 터뜨릴 것입니다.
UI 스레드에서 WaitForExit 호출을 이동하는 중입니다.
M. Babcock이 언급했듯이, 당신은 서식있는 텍스트 상자에 대한 업데이트를 기다리고 있습니다.
이와 비슷한 해결책이 효과적 일 수 있습니다.
목록을 처리하는 새 스레드를 시작하려면 btnLoad_Click을 수정하십시오 (count> 0 브랜치에 있음).

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

System. diagnostics. process. waitforexit 예
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
Process. WaitForExit는 Process. HasExited가 true 인 경우에도 반환되지 않습니다.
Process. Start를 사용하여 배치 파일을 시작합니다. 배치 파일은 "START"명령을 사용하여 여러 프로그램을 병렬로 시작한 다음 종료합니다.
일단 배치 파일이 완료되면 Process. HasExited가 true가되고 Process. ExitCode에 올바른 종료 코드가 포함됩니다.
하지만 Process. WaitForExit ()을 호출하면 중단되거나 반환되지 않습니다.
다음 코드는 문제를 보여줍니다. 배치 파일을 만들고 시작한 다음 인쇄합니다.
다음을 인쇄해야합니다.
. 하지만 결코하지 않습니다 (HasExited가 true이고 이미 ExitCode가 있음에도 불구하고).
배치 파일에 "START"명령이 들어있을 때와 표준 출력 및 / 또는 표준 오류가 리디렉션 될 때만 발생하는 것으로 나타났습니다.
WaitForExit ()이 반환하지 않는 이유는 무엇입니까?
그러한 프로세스가 종료 될 때까지 기다리는 올바른 방법은 무엇입니까?
Process. HasExited를 폴링하는 것이 안전합니까? 아니면 다른 문제가 발생할 수 있습니까?
추신 : 나는 방금 WaitForExit (100000)을 거대한 시간 초과 (확실히 만료되지 않음)로 호출하면 프로세스가 종료 될 때 즉시 반환하는 것으로 나타났습니다. 위어드. 타임 아웃이 없으면 중단됩니다.
이것은 표준 오류 및 StandardError의 이벤트 기반 비동기 처리의 특정 구현에서 아티팩트 ( "버그"라고 말합니다) 인 것 같습니다.
나는 당신이 제공 한 코드 (훌륭한 코드 예제, 그런데! :)를 실행함으로써 문제를 쉽게 재현 할 수 있었지만, 프로세스는 실제로 무한정 멈추지 않았다는 것을 알았다. 오히려 WaitForExit ()에서 리턴 된 것은 시작된 두 개의 하위 프로세스가 모두 종료 한 후에였습니다.
이것은 Process 클래스 구현의 의도적 인 부분 인 것으로 보인다. 특히 Process. WaitForExit () 메서드에서 프로세스 핸들 자체에 대한 대기가 끝나면 stdout 또는 stderr에 대한 판독기가 만들어 졌는지 확인합니다. 그렇다면 WaitForExit () 호출의 제한 시간 값이 "무한"(즉, -1)이면 코드는 실제로 리더에서 스트림의 끝을 기다립니다.
각각의 독자는 BeginOutputReadLine () 또는 BeginErrorReadLine () 메서드가 호출 될 때만 만들어집니다. stdout 및 stderr 스트림 자체는 자식 프로세스가 닫힐 때까지 닫히지 않습니다. 그래서 그 흐름이 끝날 때까지 그 흐름이 끝날 때까지 기다리게됩니다.
WaitForExit ()은 스트림의 이벤트 기반 읽기를 시작하는 메소드를 호출했는지 여부에 따라 다르게 동작해야하며 특히 해당 스트림을 직접 읽는 것으로 WaitForExit ()이 그런 식으로 동작하지 않으면 API를 이해하고 사용하기가 훨씬 어려워지는 불일치. 나는 이것을 개인적으로 버그라고 부르지 만, Process 클래스의 구현자가이 불일치를 인식하고 그것을 의도적으로 만들었을 가능성이 있다고 생각한다.
어쨌든, 임시 해결책은 API의 이벤트 기반 부분을 사용하는 대신 StandardOutput 및 StandardError를 직접 읽는 것입니다. 물론 코드가 해당 스트림에서 대기하는 경우에도 자식 프로세스가 종료 될 때까지 동일한 차단 동작이 표시됩니다.
예를 들어 (C #은 코드 예제를 이와 같이 빨리 때리기에 충분할만큼 F #을 알지 못하기 때문에) :) :
위의 해결 방법이나 이와 유사한 방법으로 기본 문제를 해결할 수 있기를 바랍니다. Niels Vorgaard Christensen이 WaitForExit () 메서드의 문제가있는 줄로 안내해 주신 데 대해 감사 드려서이 답변을 개선 할 수있었습니다.

시장 뉴스 forex 달력입니다.
외환 은행 oulu aukioloajat.
System. diagnostics. process. waitforexit 예제입니다.
프로세스 구성 요소에 관련 프로세스가 종료 될 때까지 밀리 초 동안 지정된 대기 시간을 대기하도록 지시합니다. 관련 프로세스가 종료 될 때까지 기다리는 시간 (밀리 초 단위)입니다. 최대 값은 운영 체제에 무한대를 나타내는 비트 정수의 가능한 최대 값입니다. 프로세스 ID가 설정되지 않았으므로 Id 속성을 사용할 수있는 핸들이 존재하지 않습니다. 이 Process 개체와 연결된 프로세스가 없습니다. 원격 컴퓨터에서 실행중인 프로세스에 대해 WaitForExit Int32를 호출하려고합니다. System. diagnostics. process. waitforexit 메서드는 system. diagnostics. process. waitforexit 컴퓨터에서 실행중인 프로세스에서만 사용할 수 있습니다. System. diagnostics. process. waitforexit Int32는 예제 프로세스가 종료 될 때까지 현재 스레드를 대기시킵니다. 이 메소드는 다른 모든 메소드가 호출 된 후에 호출되어야합니다. 현재 스레드를 차단하지 않으려면 Exited 이벤트를 사용하십시오. 이 메소드는 Process 구성 요소가 프로세스가 종료 될 때까지 일정 시간 대기하도록 지시합니다. 종료 요구가 거부되어 관련 프로세스가 간격 종료까지 종료되지 않으면 호출 프로 시저에 false가 리턴됩니다. milliseconds와 Process에 대해 음수 인 Infinite를 지정할 수 있습니다. WaitForExit Int32는 WaitForExit 오버로드와 동일하게 작동합니다. 메서드에 0을 전달하면 프로세스가 이미 종료 된 경우에만 true가 반환됩니다. 그렇지 않으면 즉시 false를 반환합니다. 표준 출력이 비동기 이벤트 핸들러로 방향 재 지정되면이 메소드가 리턴 될 때 출력 처리가 완료되지 않을 수도 있습니다. 비동기 이벤트 처리가 완료되었는지 확인하려면이 오버로드에서 true를 수신 한 후에 매개 변수를 취하지 않는 WaitForExit 오버로드를 호출하십시오. Windows Forms 응용 프로그램에서 Exited 이벤트가 올바르게 처리되도록하려면 SynchronizingObject 속성을 설정하십시오. 관련 프로세스 종료가 정상 또는 비정상 종료를 통해 운영 체제에 의해 종료되면 시스템은 프로세스에 대한 관리 정보를 저장하고 system. diagnostics. process. waitforexit를 호출하여 WaitForExit Int를 호출 한 구성 요소를 반환합니다. 프로세스 구성 요소는 정보, 여기에는 종료 된 프로세스에 대한 핸들을 사용하여 ExitTimeby가 포함됩니다. 연결된 프로세스가 종료 되었기 때문에 구성 요소의 System. diagnostics. process. waitforexit 속성이 더 이상 기존 프로세스 리소스를 가리 키지 않습니다. 대신 핸들은 프로세스 자원에 대한 운영 체제의 정보에 액세스하는 데에만 사용할 수 있습니다. 이 시스템은 프로세스 구성 요소에서 해제하지 않은 종료 프로세스에 대한 핸들의 예이므로 프로세스 구성 요소가 리소스를 특별히 해제 할 때까지 ExitTime 및 핸들 정보를 메모리에 유지합니다. 이러한 이유로 프로세스 예제에서 Start를 호출 할 때마다 연결된 프로세스가 종료되고 더 이상 관리 정보가 필요 없으면 Close를 호출하십시오. 닫기는 종료 된 프로세스에 할당 된 메모리를 해제합니다. ExitCode 속성에 대한 코드 예제를 참조하십시오. 다운로드 Visual Studio SDK 평가판 소프트웨어 무료 다운로드 Office 리소스 System. diagnostics. process. waitforexit 서버 리소스 SQL Server Express 리소스 Windows Server 리소스 프로그램 구독 개요 관리자 학생 Microsoft 상상 Microsoft Student Partners ISV 시작 이벤트 커뮤니티 매거진 포럼 블로그 Channel 9 문서 API 및 참조 Dev 센터 샘플 폐기 된 컨텐츠. 요청한 콘텐츠 예제가 삭제되었습니다. 프로세스 클래스 프로세스 메서드 WaitForExit 메서드. WaitForExit 메서드 WaitForExit 메서드 Int 내용 테이블을 축소합니다. 이 문서는 보관되었으며 유지 관리되지 않습니다. NET Framework 현재 버전. Int32 연관된 프로세스가 종료 될 때까지 대기하는 시간 (밀리 초). Boolean 연결된 프로세스가 종료되면 true이고, 그렇지 않으면 false입니다. 그렇지 않으면 false입니다. 예외 조건 Win32Exception 대기 설정에 액세스 할 수 없습니다. LinkDemand 직접 실행 호출자의 완전한 신뢰. 이 멤버 예제는 부분적으로 신뢰할 수있는 코드에서 사용됩니다. NET Framework이 페이지는 도움이 되었습니까? 의견을 보내 주셔서 감사합니다. 데브 센터 Windows Office Visual Studio Microsoft Azure 기타 학습 리소스 Microsoft Virtual Academy 채널 9 MSDN Magazine. 커뮤니티 포럼 블로그 Codeplex. 벤처 기업을위한 BizSpark Microsoft 학생들에게 상상해보십시오.
3 생각에 & ldquo; System. diagnostics. process. waitforexit 예 & rdquo;
귀하의 웹 사이트에 대한 광고를 고려하고 있다면 Mat Nastos가 자신의 제품을 광고하는 방법을 살펴 보는 것이 좋습니다.
편집자가 본문 내용을 개선했을뿐만 아니라 앞으로도 같은 문제를 피하는 방법에 대한 권장 사항 및 규칙을 추가 한 점에 감사드립니다.
그녀가 조금 이상하지만, 그녀는 여전히 전형적입니다 (대부분의 유리 제품은 편심합니다).

Comments

Popular Posts