[C#]WinFormからバッチプログラムを非同期で実行する

カテゴリ: C# | タグ: ,

WindowsでC#のプログラムから、別のプログラムを実行する場合、Process.Start()メソッドを利用することが多いです。

Process.Start()はasync/awaitによる非同期処理に対応しておらず、プログラム全体を非同期ベースで作成しているとき、外部プロセス呼び出しだけ形式が変わってしまうので不便です。

このような場合は、以下のメソッドを利用すると便利です。

async/awaitで非同期呼び出しできるProcess.Start()処理

Process.Start()をTaskベースにしたメソッドです。

このメソッドはStackOverflowの投稿、Is there any async equivalent of Process.Start?を参考に作成していますが、下記の2点を変更しています。

  • バッチプログラム実行のために最小化させている
  • プログラム実行時に引数を渡せるようにする
/// <summary>
/// プログラムを非同期で実行する
/// </summary>
/// <param name="fileName">実行ファイル名</param>
/// <param name="arguments">パラメータ</param>
/// <returns></returns>
static async Task RunProcessAsync( string fileName, string arguments ) {
    var tcs = new TaskCompletionSource<bool>();

    var process = new Process { 
        StartInfo = {
            FileName = fileName,
            Arguments = arguments,
            WindowStyle = ProcessWindowStyle.Minimized,
        },
        EnableRaisingEvents = true,
    };

    process.Exited += ( sender, args ) =>
    {
        tcs.SetResult( true );
        process.Dispose();
    };

    process.Start();

    return tcs.Task;
}

用意したメソッドRunProcessAsync()はTaskをreturnしています。
このため、呼び出し元は以下のようにawait付きで非同期実行可能です。

private async void Button1_Click( object sender, EventArgs e ) {
    var command = "notepad.exe";
    var param = "foo.txt";

    // 指定されたプログラムを非同期で実行
    await RunProcessAsync( command, param );
}

Amazonでおトクに買い物する方法
AmazonチャージでポイントGET


Amazonは買いもの前にAmazonギフト券をチャージしてポイントをゲットしないと損!

こちらもおススメ

コメントを残す

メールアドレスが公開されることはありません。