Sunday 18 February 2018

Vb net 시스템 진단 프로세스 시작 waitforexit


Vb system. diagnostics. process. start waitforexit
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
Process. WaitForExit를 사용하는 방법.
나는 '때때로'VB에서 작동하는 3 부 애플리케이션을 호출하고있다. (자체 호스팅 WCF이다.) 하지만 때로는 타사 앱이 영원히 멈춰 버리기 때문에 90 초 타이머를 추가했습니다. 문제는, 시간이 초과되었는지 어떻게 알 수 있습니까?
코드는 다음과 같습니다.
제가하고 싶은 것은 이것과 같습니다.
메서드 반환 값 확인 - msdn. microsoft / en - us / library /ty0d8k56.aspx - 호출 시간이 초과되면 False를 반환합니다.
과거에는 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가있는 경우입니다.
출력 데이터 또는 오류 데이터가 크기 때문에 무한정 지속되는 동안 정지 시간이 발생합니다.

프로세스. WaitForExit 메서드.
API 참조 문서에는 새로운 홈이 있습니다. 새로운 경험을 보려면 docs. microsoft의 API 브라우저를 방문하십시오.
관련 프로세스가 종료 될 때까지 기다리는 시간을 설정하고 시간이 경과되거나 프로세스가 종료 될 때까지 현재 실행 스레드를 차단합니다. 현재 스레드를 차단하지 않으려면 Exited 이벤트를 사용하십시오.
코드 예제는 StandardError 및 ExitCode 속성 참조 페이지를 참조하십시오.
어셈블리 : System (System. dll)
프로세스 구성 요소가 관련 프로세스가 종료 될 때까지 무기한 대기하도록 지시합니다.
연결된 프로세스가 종료 될 때까지 지정된 밀리 초 동안 대기하도록 Process 구성 요소에 지시합니다.

Visual Basic에서 Process. Start를 사용하는 방법.
VB 코드를 사용하여 다른 응용 프로그램을 시작해야 할 때.
Process 객체의 Start 메소드는 프로그래머가 사용할 수있는 가장 저평가 된 툴 중 하나 일 수 있습니다. 메소드로서, Start는 일련의 과부하를 가지고 있는데, 이것은 메소드가 무엇을하는지 정확하게 결정하는 매개 변수 집합입니다. 오버로드를 사용하면 시작할 때 다른 프로세스로 전달할 수있는 모든 매개 변수 집합을 지정할 수 있습니다.
Process. Start로 수행 할 수있는 작업은 실제로 사용할 수있는 프로세스에 의해서만 제한됩니다.
텍스트 기반의 ReadMe 파일을 메모장에 표시하려면 다음과 같이 쉽게 수행 할 수 있습니다.
여기서는 ReadMe 파일이 프로그램과 동일한 폴더에 있고 메모장이. txt 파일 유형의 기본 응용 프로그램이고 시스템 환경 경로에 있다고 가정합니다.
Process. Start는 VB6의 Shell 명령과 유사합니다.
Visual Basic 6에 익숙한 프로그래머의 경우 Process. Start는 VB 6 Shell 명령과 다소 비슷합니다. VB 6에서는 다음과 같은 것을 사용합니다.
Process. Start를 사용하여.
이 코드를 사용하여 메모장 최대화를 시작하고보다 정확한 제어에 사용할 수있는 ProcessStartInfo 개체를 만들 수 있습니다.
숨겨진 프로세스 시작.
숨겨진 프로세스를 시작할 수도 있습니다.
그러나 조심하십시오. 프로세스를 끝내기 위해 더 많은 코드를 추가하지 않는 한, 작업 관리자에서 코드를 종료해야 할 것입니다. 숨겨진 프로세스는 일반적으로 모든 종류의 사용자 인터페이스가없는 프로세스에서만 사용됩니다.
프로세스 이름 검색.
Process로 작업하기. 객체로 시작하면 많은 기능을 제공합니다. 예를 들어, 시작된 프로세스 이름을 검색 할 수 있습니다. 이 코드는 & # 34; notepad & # 34; 출력 창에서 :
이것은 비동기 적으로 새 응용 프로그램을 시작했기 때문에 VB6 Shell 명령으로 수행 할 수없는 작업이었습니다. WaitForExit을 사용하면 비동기 적으로 실행해야 할 경우 새 스레드에서 프로세스를 시작해야하기 때문에 역으로 문제가 발생할 수 있습니다. 예를 들어, 프로세스가 시작되고 WaitForExit가 실행 된 양식에서 구성 요소가 활성 상태로 유지되어야하는 경우. 일반적으로 이러한 구성 요소는 활성화되지 않습니다. 코드를 작성하여 직접 확인하십시오.
프로세스를 강제 종료하는 한 가지 방법은 Kill 메서드를 사용하는 것입니다.
이 코드는 10 초 동안 기다린 다음 프로세스를 종료합니다.
오류가 발생하지 않도록 프로세스가 종료되도록하려면 강제 지연이 필요하다는 것을 알았습니다.
대부분의 경우 프로세스가 사용하는 리소스를 해제하기 위해 처리를 사용하기 블록에 두는 것이 좋습니다.
이 모든 작업을보다 쉽게 ​​수행 할 수 있도록 프로젝트에 추가 할 수있는 Process 구성 요소도 있으므로 실행 시간 대신 디자인 타임에 위와 같은 많은 작업을 수행 할 수 있습니다.
이렇게하면 프로세스가 종료 된 이벤트와 같이 프로세스에서 발생하는 이벤트를 코딩하는 것이 훨씬 쉬워집니다. 다음과 같은 코드를 사용하여 핸들러를 추가 할 수도 있습니다.
그러나 단순히 구성 요소에 대한 이벤트를 선택하는 것이 훨씬 쉽습니다.

No comments:

Post a Comment