프로세스가 끝날 때까지 기다리십시오


206

나는 응용 프로그램을 가지고

Process.Start()

다른 애플리케이션 'ABC'를 시작합니다. 해당 응용 프로그램이 종료 될 때까지 기다렸다가 프로세스가 계속 진행되고 싶습니다. 내가 어떻게 해?

애플리케이션 'ABC'의 인스턴스가 동시에 여러 개있을 수 있습니다.


그리고 비동기식으로 수행하려면 (예 : 완료 후 이벤트 발생) 여기 에서 SO를 수 있습니다 .
Matt

답변:


401

나는 당신이 이것을 원한다고 생각합니다.

var process = Process.Start(...);
process.WaitForExit();

방법 은 MSDN 페이지 를 참조하십시오 . 또한 시간 초과를 지정할 수있는 과부하가 있으므로 영원히 기다릴 필요가 없습니다.


137

사용 Process.WaitForExit? 또는 Process.Exited차단하지 않으려면 이벤트를 구독 하시겠습니까? 그래도 원하는 방식으로 작동하지 않으면 요구 사항에 대한 자세한 정보를 알려주십시오.


Process.Exited에 대한 좋은 정보이지만 OP는 "대기"라고 말함
Mike M

8
@ MikeM : 이것이 내가 WaitForExit처음 언급 한 이유입니다 ... 어떤 경우에는 무언가가 끝나면 더 많은 코드를 실행하고 싶을 수도 있지만 현재 스레드를 차단해야한다는 의미는 아닙니다.
Jon Skeet 2016 년

7
Process.Exited이벤트 를 사용하려는 경우 Process.EnableRaisingEventstrue 로 설정 하여 미리 프로세스를 구성해야한다고 생각 합니다. 이 질문이 3 년이 넘었 음을 고려할 때, 질문 Process.EnableRaisingEvents을 받았을 때의 문제가 아닐 수도 있습니다 .

나는이 페이지에서 Process.Exited사건 의 이름을 찾아 내었다 . 감사! 완전성 +1
Chad

36

내 응용 프로그램에서 다음을 수행합니다.

Process process = new Process();
process.StartInfo.FileName = executable;
process.StartInfo.Arguments = arguments;
process.StartInfo.ErrorDialog = true;
process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
process.Start();
process.WaitForExit(1000 * 60 * 5);    // Wait up to five minutes.

유용한 몇 가지 추가 기능이 있습니다 ...


17

종료 대기를 사용하거나 HasExited 속성을 포착하고 UI를 업데이트하여 사용자에게 "알림"을 유지 (예측 관리) 할 수 있습니다.

System.Diagnostics.Process process = System.Diagnostics.Process.Start("cmd.exe");
while (!process.HasExited)
{
    //update UI
}
//done

9

Process.HasExited프로세스에 속한 창을 닫은 후에 변경되지 않은 경우가있었습니다 . 그래서 Process.WaitForExit()작동하지 않았습니다. 나는 Process.Responding창문을 닫은 후 거짓으로 된 것을 모니터링 해야했습니다.

while (!_process.HasExited && _process.Responding) {
  Thread.Sleep(100);
}
...

아마도 이것은 누군가를 도울 것입니다.



1

Microsoft 예를 참조 하십시오 . [ https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.enableraisingevents?view=netframework-4.8]

가장 좋은 방법은 다음과 같습니다.

myProcess.EnableRaisingEvents = true;

다른 한편으로는 강령이 차단됩니다. 또한 추가 속성이 필요하지 않습니다.

// Start a process and raise an event when done.
myProcess.StartInfo.FileName = fileName;
// Allows to raise event when the process is finished
myProcess.EnableRaisingEvents = true;
// Eventhandler wich fires when exited
myProcess.Exited += new EventHandler(myProcess_Exited);
// Starts the process
myProcess.Start();

// Handle Exited event and display process information.
private void myProcess_Exited(object sender, System.EventArgs e)
{
Console.WriteLine(
                  $"Exit time    : {myProcess.ExitTime}\n" +
                  $"Exit code    : {myProcess.ExitCode}\n" +
                  $"Elapsed time : {elapsedTime}");
}

0

Jon Skeet이 말했듯이 다음을 사용하십시오 Process.Exited.

proc.StartInfo.FileName = exportPath + @"\" + fileExe;
proc.Exited += new EventHandler(myProcess_Exited);
proc.Start();
inProcess = true;

while (inProcess)
{
    proc.Refresh();
    System.Threading.Thread.Sleep(10);
    if (proc.HasExited)
    {
        inProcess = false;
    }
}

private void myProcess_Exited(object sender, System.EventArgs e)
{
    inProcess = false;
    Console.WriteLine("Exit time:    {0}\r\n" +
      "Exit code:    {1}\r\n", proc.ExitTime, proc.ExitCode);
}

실제로 질문에 대답하지 않습니다. 문제를 해결하려면 답변을 수정하십시오
Grantly

그리고 지금? ) 어쩌면 개방 VB와는 솔루션입니다
데이비드 로페스

-5

이 시도:

string command = "...";
var process = Process.Start(command);
process.WaitForExit();

5
이미 답변 된 질문에 대해 이미 답변 된 질문에 대한 답변에 대해 언급하는 요점은 무엇입니까? 당신은 당신의 자신의 사이클을 낭비했을뿐만 아니라, 나도 낭비하도록 강요했습니다.
Jamie Ivanov

@AdamBilinski 질문과 답변은 질문을 한 사람 만이 아니라 다른 사람이 볼 수 있도록 고안되었습니다
L3n

4
@ L3n 동의하지만이 답변은 허용되는 답변과 정확히 동일하므로 의미가 없습니다!
Adam Bilinski

@AdamBilinski Oh yea는 귀하의 의견을 제대로 읽지 못했습니다 xD
L3n
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.