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 );
}
こちらもおススメ