プロセスが終了するまで待つ


206

私はするアプリケーションを持っています

Process.Start()

別のアプリケーション「ABC」を開始します。そのアプリケーションが終了する(プロセスが終了する)まで待ち、実行を続けたい。どうすればできますか?

アプリケーション「ABC」の複数のインスタンスが同時に実行されている可能性があります。


また、非同期で実行する場合(つまり、完了後にイベントを発生させる場合)は、SO を参照してください
マット

回答:


401

私はあなたがこれを望んでいると思います:

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

メソッドについては、MSDNページを参照してください。また、タイムアウトを指定できるオーバーロードがあるため、永久に待機する可能性はありません。


137

使用しProcess.WaitForExitますか?またはProcess.Exited、ブロックしたくない場合は、イベントをサブスクライブしますか?それでも問題が解決しない場合は、要件の詳細をお知らせください。


Process.Exitedで間違いなく良い情報ですが、OPは「待機」と言っていました
Mike M

8
@MikeM:これが私がWaitForExit最初に参照した理由です...場合によっては、何かが終了したときにさらに多くのコードを実行したい場合がありますが、それは現在のスレッドをブロックする必要があるという意味ではありません。
Jon Skeet

7
Process.Exitedイベントを使用する場合は、Process.EnableRaisingEventstrueに設定してプロセスを事前に構成する必要があると思います。この質問は3年以上前Process.EnableRaisingEventsのものであることを考えると、質問された時点ではそれは問題ではなかった可能性があります。
ウィル

Process.Exitedイベントの名前を探して、このページに巻き込みました。ありがとう!完全性のための+1
チャド

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

exit for waitを使用するか、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そのようにウィンドウを閉じた後にfalseになることを監視する必要がありました:

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

ジョンスキートが言うように、使用します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);
}

質問には本当に答えません。回答を
絞り込んで

そして今?多分vbを開いて解決策を作成してください;)
David Lopes

-5

これを試して:

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

5
すでに回答されている質問について、すでに回答された質問への回答にコメントするポイントは何ですか?あなたは自分のサイクルを無駄にしただけでなく、私も私の鉱山を浪費せざるを得ませんでした。
ジェイミーイワノフ2015

@AdamBilinskiの質問と回答は、質問した人だけでなく、質問をしている他の人にも見られるように意図されています
L3n

4
@ L3n同意しますが、この回答は承認された回答とまったく同じなので、無意味です。
Adam Bilinski、2015

@AdamBilinski Oh yeaはコメントを正しく読みません
でした。xDを
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.