ホームページ >バックエンド開発 >C++ >GUI をブロックせずに .NET でプロセスが終了するのを非同期的に待つにはどうすればよいですか?

GUI をブロックせずに .NET でプロセスが終了するのを非同期的に待つにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-05 05:34:43163ブラウズ

How Can I Asynchronously Wait for a Process to Exit in .NET without Blocking the GUI?

プロセスが非同期で終了するのを待機

Process.WaitForExit( を使用して GUI をブロックせずにプロセスが終了するのを待つのは困難な場合があります)。これに対処するために、イベント駆動型のアプローチと、非同期パターンを使用した代替ソリューションを検討してみましょう。

4.0 より前の .NET バージョンでは、終了を待機してトリガーをトリガーするための別のスレッドを作成する必要がありました。イベント。ただし、.NET 4.0 と C# 5 での非同期プログラミングの導入により、このプロセスをよりエレガントに表現できるようになりました。

async と await を使用した非同期待機

async パターンを使用すると、プロセスが非同期で終了するのを待つことができます。以下に例を示します:

/// <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...
}

拡張メソッド WaitForExitAsync を使用すると、GUI をブロックせずにプロセスが非同期で終了するのを待つことができます。 。 await キーワードは、プロセスが完了するかキャンセル トークンがトリガーされるまで、Test メソッドの実行を一時停止します。

以上がGUI をブロックせずに .NET でプロセスが終了するのを非同期的に待つにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。