ホームページ >バックエンド開発 >C++ >C# で非同期プロセスの実行を実現するにはどうすればよいですか?

C# で非同期プロセスの実行を実現するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-05 13:15:42930ブラウズ

How to Achieve Asynchronous Process Execution in C#?

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 サイトの他の関連記事を参照してください。

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