single.php

C# WinUI3で外部プロセスの出力結果やエラー文字列を非同期で受け取る方法

C# WinUI 3アプリを作っていく途中で、調べたことを忘録的に投稿します。今回はWinUI3プロジェクトで[FFmpeg]など外部プログラムを実行した結果やエラー文字列を非同期で受け取る方法です。

非同期で受け取るイベントの追加

外部プログラムを操作した結果やエラーは[System.Diagnostics]アセンブリの[Process]クラスを使って受け取ることが可能です。

[Process]には[StandardOutput]や[StandardError]プロパティがあり、それぞれ[StreamReader]として値の受取が可能です。

プロセスの出力やエラーが複数ある場合には、すべての出力が終わるまで応答が戻ってこない場合もあるので、実行しているアプリがフリーズした状態に見えることがあります。

そのため、非同期で出力やエラーを取得すると外部プログラムの状態を把握できる場合があります。

具体的に[ffmpeg.exe]のエラーを出力やエラーを非同期で取得するには、こんな感じで行います。

System.Diagnostics.Process process = new System.Diagnostics.Process();

process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardOutput = true;
process.OutputDataReceived += ProcessOutputDataReceived;
process.ErrorDataReceived += ProcessErrorDataReceived;

process.StartInfo.FileName = "ffmpeg.exe";
process.StartInfo.Arguments = args;
process.StartInfo.RedirectStandardInput = false;
process.StartInfo.CreateNoWindow = true;

process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();

process.WaitForExit();
process.Close();

static void ProcessOutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
{
    Debug.WriteLine(e.Data);
}

static void ProcessErrorDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
{
    Debug.WriteLine(e.Data);
}

実行して、エラーや出力が発生する度に[ProcessErrorDataReceived]イベントや[ProcessOutputDataReceived]イベントが呼び出されます。

イベントの引数にエラーや出力の内容が取得できます。

まとめ

今回は、短い記事ですがWinUI3プロジェクトで外部プログラムを実行した結果やエラー文字列を非同期で取得する方法について紹介しました。

[Process]で外部アプリを実行する際に[RedirectStandardOutput]プロパティを有効にして、[OutputDataReceived]に任意のイベントを登録しておくとプロセスからの出力が発生する度にイベントが呼び出され出力された文字列が取得可能です。

WinUI 3 アプリで外部アプリの応答を非同期で取得したい人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です