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

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

Process.Start()

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

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



답변

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

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

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


답변

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


답변

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

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.

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


답변

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

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


답변

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

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

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


답변

Process.WaitForExit 는 당신이 찾고있는 것이어야합니다.


답변

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}");
}