ホームページ >バックエンド開発 >C++ >ファイアアンドフォーゲット非同期操作: 非同期/待機と「古い非同期デリゲート」のどちらが優れていますか?

ファイアアンドフォーゲット非同期操作: 非同期/待機と「古い非同期デリゲート」のどちらが優れていますか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-08 07:39:41340ブラウズ

Fire-and-Forget Asynchronous Operations: Async/Await vs. the

C# のファイアアンドフォーゲット非同期操作: 非同期/待機と従来の方法

Fire-and-forget メソッドは、明示的なトレースを必要としない非同期操作に最適です。 C# には、従来の非同期デリゲートと新しい async/await 構文の 2 つの主なアプローチがあります。

Async/Await のレビュー

async/await 構文により、fire-and-forget 操作が簡素化され、手動で EndInvoke() を呼び出してハンドルを閉じる必要がなくなります。ただし、ターゲット メソッドでタスクを明示的に待機する必要があります。これは、非同期に変換する必要がある既存の同期メソッドにとっては不便な場合があります。

パフォーマンスとクリーンアップに関する考慮事項

async/await は見た目はすっきりしていますが、必ずしもパフォーマンスに大きなメリットがあるわけではありません。どちらの方法でも、操作を実行するために新しいスレッド プールのスレッドを割り当てる必要があります。

同期メソッドの非同期呼び出し

バックグラウンド メソッドを変更できない場合、async/await を使用したファイア アンド フォーゲット変換は簡単ではありません。回避策の 1 つは、次のように、同期メソッドで Task.Run() を待機するラッパー非同期メソッドを作成することです。

<code class="language-csharp">async Task DoAsync(string entry)
{
    await Task.Run(() => DoIt(entry));
}</code>

Async Void の使用は避けることをお勧めします

答えが示すように、async void メソッドのエラー処理は予測不可能であるため、可能であれば回避する必要があります。

Task.Run() を使用して Fire-and-Forget を簡素化する

最大限の簡素化のために、Task.Run() を直接使用して、async/await を使用せずにファイアアンドフォーゲット方式で同期メソッドを実行することを検討してください。

<code class="language-csharp">Task.Run(() => DoIt(entry));</code>
このアプローチは、EndInvoke() を手動で呼び出してハンドルを閉じるオーバーヘッドなしで、「古い非同期デリゲート」の動作をエミュレートします。

以上がファイアアンドフォーゲット非同期操作: 非同期/待機と「古い非同期デリゲート」のどちらが優れていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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