Wednesday, 14 March 2018

C # 프로세스 클래스 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 # 프로세스 클래스 waitforexit
Windows 내부 응용 프로그램을 호출 할 클래스를 작성했습니다. 이와 관련된 코드는 다음과 같습니다.
public partial class Form1 : Form.
개인 무효 button1_Click (개체 발신자, EventArgs 전자)
프로세스 p = 새 프로세스 ();
p. StartInfo = 새로운 ProcessStartInfo ( "D : \\ 새 폴더 \\ abc. txt");
System. Windows. Forms. MessageBox. Show (& quot; 메모장을로드하고 싶습니다. 그런 다음 내 코드가 무엇이든 할 수있게하고 싶습니다.
그 메모장에서하고 싶은 것들. ");
여기에서 메모장 응용 프로그램이 성공적으로로드되지만 실행 지점은 p. WaitForExit ()에 고정되어 있으며 언급 된 메시지가있는 메시지 상자를 표시 할 수 없습니다. 메모장과 같은 응용 프로그램을로드 할 수있는 방법이 있습니까? 그런 다음 메모장에서 작업을 계속할 수 있습니까? 물론 내 코드가 실행에 집착하지 않고 나머지 코드도 실행됩니다.
Moved by Peter Ritchie MVP, 중재자 2008 년 11 월 13 일 목요일 오후 2:56 BCL의 형식에 대한 질문. C # 언어 구문 (Visual C # 언어에서 기본 클래스 라이브러리로 이동 됨)
그리고 p. WaitForExit ()를 모두 제거하십시오.
Tan Silliksaar에 의해 편집 됨 2008 년 11 월 13 일 목요일 오전 9:43 Pratap15 목요일, 11 월 13, 2008 오전 10:49에 의해 답변으로 표시되었습니다.
모든 답장.
그리고 p. WaitForExit ()를 모두 제거하십시오.
Tan Silliksaar에 의해 편집 됨 2008 년 11 월 13 일 목요일 오전 9:43 Pratap15 목요일, 11 월 13, 2008 오전 10:49에 의해 답변으로 표시되었습니다.
그건 내 문제를 해결해 준다. 내가 어딘가에 다시 갇히게되면 다시 올거야.
Pratap15 목요일, 11 월 13, 2008 10:48 AM 응답하지 않음 Pratap15 목요일, 11 월 13, 2008 10:49 AM 응답하지 않음 Pratap15 목요일, 11 월 13, 2008 10:49 AM 응답하지 않음 Pratap15 목요일, November 13, 2008 오전 10:49.
Microsoft는 Msdn 웹 사이트에 대한 귀하의 의견을 이해하기 위해 온라인 설문 조사를 실시하고 있습니다. 참여를 선택하면 Msdn 웹 사이트를 탈퇴 할 때 온라인 설문 조사가 제공됩니다.

C # 프로세스 클래스 waitforexit
내 응용 프로그램에 다음 코드가 있습니다.
System. Diagnostics. Process proc = new System. Diagnostics. Process ();
다른 응용 프로그램을 통해 이것을 호출하면 프로세스가 중지됩니다.
그런 다음 5 초를 기다렸다가 이제는 정상적으로 작동합니다. 그러나이 시간 초과 값은 시스템 리소스 및 입력 응용 프로그램의 처리량에 따라 달라질 수 있으므로이 문제를 수정하는 더 좋은 방법을 찾아야합니다.
그래서, 내 질문은 우리가 System. Diagnostics를 사용하여 프로세스를 만들고 있다면, OS가 별도의 스레드를 만들고 그것을 기본 스레드 또는 UI 스레드로 만드나요?
또는 System. Threading. Thread와 동일한 CLR 스레드를 만드는 중입니까?
Thread-pool을 사용하여 작업자 스레드를 생성하는 것이 더 좋은 선택일까요?
스레드 풀이 사용자 모드 스케줄링을 사용합니까?
이것에 대한 당신의 도움을 감사하십시오.
System. Diagnostics가 배경 스레드 또는 작업자 스레드도 생성하기 때문에 하루가 끝날 때 변경 사항이 없으므로 별도의 스레드를 다시 만들지 않으므로 그 점을 알아야합니다.
위의 구현과 백그라운드 스레드를 만드는 것의 차이점은 무엇입니까?
응용 프로그램의 내부 및 외부 스레드를 혼란스럽게합니다. UI 스레드에서 WaitForExit을 사용하는 경우. UI 스레드가 응답하지 않게됩니다. 문제가 발생하면 BackgroundWorker의 DoWork 이벤트에 새 프로세스를 생성하십시오. 프로세스가 종료되면 UI 스레드에 경고하는 RunWorkerCompleteEvent가 트리거됩니다.
민 주 (Min Zhu) 마이크로 소프트 우연한 직원의 답변으로 표시 중재자 Monday, July 18, 2011 3:10 AM.
모든 답장.
EnableRaisingEvents = false로 이벤트를 기다리면 WaitForExit을 타이머로 사용하고 있음을 의미합니다. 적절한 값으로 설정하십시오.
EnableRaisingEvents = false로 이벤트를 기다리면 WaitForExit을 타이머로 사용하고 있음을 의미합니다. 적절한 값으로 설정하십시오.
저는 5000을 값으로 주었고 문제를 해결했습니다. 내 걱정은 다른 시스템 자원, 입력 내용 크기 등으로 유사하게 작동합니까?
관련 프로세스가 간격의 끝까지 종료되지 않으면 어떻게됩니까?
Windows는 실시간 운영 체제가 아니므로 모든 타이머는 OS의 일정에 따라 달라집니다. 아마도 System. Timers. Timer가 가장 정확합니다.
& quot; 관련 프로세스가 간격의 끝까지 종료되지 않으면 어떻게됩니까? & quot; 이 기능을 사용 중지했습니다. 이것이 당신이하려고하는 것이라면 그것을 가능하게하십시오. 프로세스를 시작하는 데 사용한 스레드를 차단하고 싶지 않으면 백그라운드 스레드에서 시작하십시오. BackgxroundWorker가 이에 적합합니다.
System. Diagnostics가 배경 스레드 또는 작업자 스레드도 생성하기 때문에 하루가 끝날 때 변경 사항이 없으므로 별도의 스레드를 다시 만들지 않으므로 그 점을 알아야합니다.
위의 구현과 백그라운드 스레드를 만드는 것의 차이점은 무엇입니까?
System. Diagnostics가 배경 스레드 또는 작업자 스레드도 생성하기 때문에 하루가 끝날 때 변경 사항이 없으므로 별도의 스레드를 다시 만들지 않으므로 그 점을 알아야합니다.
위의 구현과 백그라운드 스레드를 만드는 것의 차이점은 무엇입니까?
응용 프로그램의 내부 및 외부 스레드를 혼란스럽게합니다. UI 스레드에서 WaitForExit을 사용하는 경우. UI 스레드가 응답하지 않게됩니다. 문제가 발생하면 BackgroundWorker의 DoWork 이벤트에 새 프로세스를 생성하십시오. 프로세스가 종료되면 UI 스레드에 경고하는 RunWorkerCompleteEvent가 트리거됩니다.
민 주 (Min Zhu) 마이크로 소프트 우연한 직원의 답변으로 표시 중재자 Monday, July 18, 2011 3:10 AM.
Microsoft는 Msdn 웹 사이트에 대한 귀하의 의견을 이해하기 위해 온라인 설문 조사를 실시하고 있습니다. 참여를 선택하면 Msdn 웹 사이트를 탈퇴 할 때 온라인 설문 조사가 제공됩니다.

프로세스. BeginOutputReadLine 메서드 ()
API 참조 문서에는 새로운 홈이 있습니다. 새로운 경험을 보려면 docs. microsoft의 API 브라우저를 방문하십시오.
응용 프로그램의 리디렉션 된 StandardOutput 스트림에서 비동기 읽기 작업을 시작합니다.
어셈블리 : System (System. dll)
비동기 읽기 조작이 이미 StandardOutput 스트림에서 진행 중입니다.
StandardOutput 스트림은 동기 읽기 조작에 의해 사용되었습니다.
StandardOutput 스트림은 동 기적 또는 비동기 적으로 읽을 수 있습니다. Read, ReadLine 및 ReadToEnd와 같은 메서드는 프로세스의 출력 스트림에 대한 동기 읽기 작업을 수행합니다. 이러한 동기 읽기 작업은 연결된 Process가 해당 StandardOutput 스트림에 쓰거나 스트림을 닫을 때까지 완료되지 않습니다.
반대로 BeginOutputReadLine은 StandardOutput 스트림에서 비동기 읽기 작업을 시작합니다. 이 메서드는 스트림 출력에 지정된 이벤트 처리기를 활성화하고 호출자에게 즉시 반환합니다. 호출자는 스트림 출력이 이벤트 처리기로 전달되는 동안 다른 작업을 수행 할 수 있습니다.
프로세스의 StandardOutput에서 비동기 읽기 작업을 수행하려면 다음 단계를 수행하십시오.
이벤트 처리기를 OutputDataReceived 이벤트에 추가하십시오. 이벤트 처리기는 System. Diagnostics와 일치해야합니다. DataReceivedEventHandler 대리자 서명입니다.
프로세스의 BeginOutputReadLine을 호출하십시오. 이 호출은 StandardOutput에서 비동기 읽기 작업을 시작합니다.
비동기 읽기 작업이 시작되면 연결된 프로세스가 텍스트 줄을 StandardOutput 스트림에 쓸 때마다 이벤트 처리기가 호출됩니다.
CancelOutputRead를 호출하여 비동기 읽기 조작을 취소 할 수 있습니다. 읽기 조작은 호출자 또는 이벤트 핸들러에 의해 취소 될 수 있습니다. 취소 한 후 BeginOutputReadLine을 다시 호출하여 비동기 읽기 작업을 다시 시작할 수 있습니다.
리디렉션 된 스트림에서 비동기 및 동기 읽기 작업을 혼합 할 수 없습니다. 리디렉션 된 프로세스 스트림을 비동기식 모드 나 동기식 모드에서 열면 해당 스트림에 대한 모든 추가 읽기 작업이 동일한 모드에 있어야합니다. 예를 들어 BeginOutputReadLine을 따라 StandardOutput 스트림에서 ReadLine을 호출하거나 그 반대로 수행하지 마십시오. 그러나 서로 다른 두 개의 스트림을 다른 모드로 읽을 수 있습니다. 예를 들어, BeginOutputReadLine을 호출 한 다음 StandardError 스트림에 대해 ReadLine을 호출 할 수 있습니다.
다음 예제에서는 sort 명령의 리디렉션 된 StandardOutput 스트림에서 비동기 읽기 작업을 수행하는 방법을 보여줍니다. sort 명령은 텍스트 입력을 읽고 정렬하는 콘솔 응용 프로그램입니다.
이 예제에서는 SortOutputHandler 이벤트 핸들러에 대한 이벤트 대리자를 만들고이 이벤트를 OutputDataReceived 이벤트와 연결합니다. 이벤트 처리기는 리디렉션 된 StandardOutput 스트림에서 텍스트 줄을 받아 텍스트 서식을 지정하고 텍스트를 화면에 씁니다.
즉각적인 호출자에 대한 완전한 신뢰. 이 멤버는 부분적으로 신뢰할 수있는 코드에서 사용할 수 없습니다.

No comments:

Post a Comment