web-dev-qa-db-ja.com

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

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

Process.Start()

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

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

184
NLV

あなたはこれが欲しいと思う:

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

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

366
Noldorin

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

127
Jon Skeet

私は自分のアプリケーションで次のことを行います。

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.

便利な機能がいくつかあります...

34
AnthonyLambert

終了の待機を使用するか、HasExitedプロパティをキャッチしてUIを更新し、ユーザーに「情報」を提供します(期待値管理)。

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

プロセスに属するウィンドウを閉じた後、Process.HasExitedが変更されない場合がありました。したがって、Process.WaitForExit()も機能しませんでした。そのようなウィンドウを閉じた後にfalseになったProcess.Respondingを監視する必要がありました。

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

おそらくこれは誰かを助ける。

8
Buka

Process.WaitForExit は、まさにあなたが探しているものだと思います。

6
Hans Olsson

ジョンスキートが言うように、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);
}
0
David Lopes