イベントを使用した非同期 Process.WaitForExit()
Process.WaitForExit() の非ブロック代替手段について問い合わせたところ、次のことが発見されました。貴重なイベント駆動型のアプローチです。特に .NET 4.0/C# 5 以降に関連するこの非同期パターンは、洗練されたソリューションを提供します。
次のコード スニペットを検討してください。
/// <summary> /// Waits asynchronously for the process to exit. /// </summary> /// <param name="process">The process to wait for cancellation.</param> /// <param name="cancellationToken">A cancellation token. If invoked, the task will return /// immediately as canceled.</param> /// <returns>A Task representing waiting for the process to end.</returns> public static Task WaitForExitAsync(this Process process, CancellationToken cancellationToken = default(CancellationToken)) { if (process.HasExited) return Task.CompletedTask; var tcs = new TaskCompletionSource<object>(); process.EnableRaisingEvents = true; process.Exited += (sender, args) => tcs.TrySetResult(null); if (cancellationToken != default(CancellationToken)) cancellationToken.Register(() => tcs.SetCanceled()); return process.HasExited ? Task.CompletedTask : tcs.Task; }
この非同期メソッドを利用するには、単にメソッドを呼び出します。次のように:
public async void Test() { var process = new Process("processName"); process.Start(); await process.WaitForExitAsync(); //Do some fun stuff here... }
このイベント駆動型の非同期アプローチを採用することで、効率的に次のことができます。 UI の応答性を損なうことなくプロセスの完了を監視します。
以上が.NET でブロックせずにプロセスの終了を非同期的に待つにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。