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中文网其他相关文章!