C# での非同期プロセスの実行
質問:
.NET Framework では、 Process.Start メソッドを使用すると、外部アプリケーションを実行したり、バッチ ファイルを実行したりできます。ただし、このメソッドは同期メソッドです。つまり、プロセスが完了するまで呼び出しスレッドをブロックします。プロセスの完了を待機できる、Process.Start の非同期代替手段はありますか?
回答:
Process.Start は同期メソッドですが、方法はあります。 C# で非同期プロセスの実行を実現します。ここでは 2 つのアプローチを示します。
Task.Run の使用:
単にプロセスを非同期で開始したい場合は、Task.Run メソッドを使用できます。これにより、新しいスレッドが作成され、そのスレッド上でプロセスが実行され、呼び出し元のスレッドが解放されます。
private async void RunCommandAsync() { await Task.Run(() => Process.Start("command to run")); }
プロセス完了を非同期で待機:
必要に応じてプロセスが終了するのを非同期的に待機して終了コードを取得するには、Process.Exited イベントを一緒に使用できます。 TaskCompletionSource
private async Task<int> RunProcessAsync(string fileName) { var tcs = new TaskCompletionSource<int>(); var process = new Process { StartInfo = { FileName = fileName }, EnableRaisingEvents = true }; process.Exited += (sender, args) => { tcs.SetResult(process.ExitCode); process.Dispose(); }; process.Start(); return await tcs.Task; }
このアプローチでは、新しいプロセスが作成され、Exited イベントのイベント ハンドラーが登録されます。プロセスが終了すると、イベント ハンドラーがトリガーされ、TaskCompletionSource がプロセスの終了コードで完了します。 await オペレーションは、プロセスが完了するまで呼び出し元のコードの実行を一時停止します。
以上がC# で非同期プロセスの実行を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。