首页 >后端开发 >C++ >异步/等待中的'即发即忘”与'等待”:有什么区别以及何时应该使用它们?

异步/等待中的'即发即忘”与'等待”:有什么区别以及何时应该使用它们?

Barbara Streisand
Barbara Streisand原创
2025-01-12 13:17:42881浏览

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