プロセスの終了を待つ

Web検索はbingがおすすめ!

await を利用して他のプログラムの実行の終了を非同期で待つ - C#

awaitを利用して他のプログラムの実行の終了を非同期で待つコードを紹介します。

概要

こちらの方法で、他のアプリの終了を待つことができますが、終了を待つあいだメインのアプリケーションはロックされたままとなります。
この記事ではawaitを利用して非同期でアプリの終了を待つ方法を紹介します。
awaitを利用して待機する場合は、Process クラスの WaitForExitAsync() メソッドがawaitに対応しています。

プログラム

Windows Formアプリケーション作成します。

UI

下図のフォームを作成します。

コード

以下のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ExecApplicationAwait
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private async void button1_Click(object sender, EventArgs e)
    {
      Process proc = new Process();
      proc.StartInfo.FileName = "notepad.exe";
      proc.Start();
      await proc.WaitForExitAsync();
      textBox1.Text += "notepad.exeが終了しました\r\n";
    }
  }
}

解説

基本の動作はこちらの記事で紹介しているスレッドブロックされる方法と同じコードです。
違いは、プロセスの終了を待つ部分が、WaitForExit() メソッドではなく、WaitForExitAsync() メソッドで待機します。
awaitを記述して待機を指定します。

また、awaitを利用する場合は、メソッドの定義にasyncキーワードを追加します。
private async void button1_Click(object sender, EventArgs e)

Processオブジェクトで起動したアプリケーションが終了すると、awaitの次の行から実行が再開されます。

補足

Processオブジェクトの生成部分は以下の書式でも問題なく同視します。
  private async void button1_Click(object sender, EventArgs e)
  {
    Process proc = Process.Start("notepad.exe");
    await proc.WaitForExitAsync();
    textBox1.Text += "notepad.exeが終了しました\r\n";
  }

実行結果

プロジェクトを実行します。アプリケーションが起動し、下図のウィンドウが表示されます。


[button1]をクリックします。ボタンをクリックするとメモ帳が起動します。


メモ帳のウィンドウを閉じてメモ帳を終了します。メモ帳が終了すると、アプリケーションのテキストボックスに、 メモ帳が終了した旨のメッセージが表示されます。


今回紹介した実装方法ではメインスレッドはブロックされないため、メモ帳が起動している状態で、呼び出し元のアプリケーションの ウィンドウはフリーズせずに、操作を続けることができます。


著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2022-11-13
iPentec all rights reserverd.