Async/Await での Fire and Forget と Awaiting: 違いと使用シナリオ
次のコードは、Callee
メソッドを呼び出すさまざまな方法とその動作の違いを示しています。
コール #1: Fire and Forget (シンプル)
Callee
このメソッドは非同期で呼び出され、呼び出し元をブロックしません。
コール #2: タスク待ち (遅延)
Callee
メソッドは await
キーワードを使用し、呼び出し元はそれが完了するまで待機します。 Callee
メソッドには 1000 ミリ秒の遅延が含まれるため、呼び出し側では 1 秒以上かかります。
コール #3 & #5: Task.Run(Fire and Forget)
Task.Run
Callee
メソッドを実行のためにスレッド プールに送信します。 await
は使用されないため、両方の呼び出しは Fire and Forget であり、呼び出し元をブロックしません。
呼び出し #4 & #6: Task.Run(タスクの待機)
#3 と #5 に似ていますが、Task.Run
は内部で await
を使用します。これにより、これらは #2 と同等になり、呼び出し元はタスクが完了するまで待機します。
#3 と #5 の違い
#3 と #5 は両方とも Task.Run
を使用しますが、微妙な違いがあります。 #3 では、Callee
が直接呼び出され、スレッド プールに新しいタスクが作成されます。 #5 では、Callee
が非同期ラムダ式でラップされ、独自のステート マシンを持つ新しいタスクが作成されます。ただし、どちらのミッションも Fire と Forget であるため、この場合、違いは重要ではありません。
Service Fabric に関する注意事項
Service Fabric への移行後、HostingEnvironment.QueueBackgroundWorkItem
はサポートされなくなりました。代わりに Task.Run
を使用することもできますが、別のバックグラウンド プロセスを使用し、キュー経由で通信することをお勧めします。これにより、フロントエンド サービスとバックエンド サービスが確実に分離され、パフォーマンスの問題やデッドロックが防止されます。
以上がFire and Forget と Async/Await での待機: 違いは何ですか? それぞれをいつ使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。