首頁 >後端開發 >C++ >非同步/等待中的「即發即忘」與「等待」:有什麼區別以及何時應該使用它們?

非同步/等待中的「即發即忘」與「等待」:有什麼區別以及何時應該使用它們?

Barbara Streisand
Barbara Streisand原創
2025-01-12 13:17:42876瀏覽

Fire and Forget vs. Awaiting in Async/Await: What's the Difference and When Should You Use Each?

Async/Await 中的 Fire and Forget 與 Awaiting:區別與使用場景

以下程式碼展示了 Callee 方法的不同呼叫方式及其行為差異。

呼叫 #1:Fire and Forget (簡單)

Callee 方法非同步調用,不阻塞調用方。

呼叫 #2:Awaiting 任務 (延遲)

Callee 方法使用 await 關鍵字,呼叫方等待完成。由於 Callee 方法包含 1000ms 延遲,呼叫方將耗時超過一秒。

呼叫 #3 & #5:Task.Run(Fire and Forget)

Task.RunCallee 方法提交到執行緒池執行。由於未使用 await,這兩個呼叫均為 Fire and Forget,不阻塞呼叫方。

呼叫 #4 & #6:Task.Run(Await 任務)

與 #3 和 #5 類似,但 Task.Run 內部使用了 await。這使得它們等效於 #2,呼叫方將等待任務完成。

#3 和 #5 的差別

雖然 #3 和 #5 都使用了 Task.Run,但存在細微差別。在 #3 中,Callee 直接調用,在執行緒池上建立一個新任務。在 #5 中,Callee 被包裝在一個非同步 lambda 表達式中,這將建立一個具有自身狀態機的新的任務。然而,由於這兩個任務都是 Fire and Forget,因此在這種情況下,這種差異並不顯著。

Service Fabric 的注意事項

移轉到 Service Fabric 後,HostingEnvironment.QueueBackgroundWorkItem 已不再受支援。雖然可以使用 Task.Run 作為替代,但更好的做法是使用單獨的後台進程,並透過佇列與之通訊。這確保了前端和後台服務之間的隔離,防止效能問題或死鎖。

以上是非同步/等待中的「即發即忘」與「等待」:有什麼區別以及何時應該使用它們?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn