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.Run
將 Callee
方法提交到執行緒池執行。由於未使用 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中文網其他相關文章!