Fire and forget in ASP.NET Core with dependency alive
在C#中,实现fire and forget非常简单,只需使用Task.Run(() => FireAway())。然而,在ASP.NET Core控制器中,这种方法可能并不合适。当我们在控制器中触发一个耗时的任务,任务将作为fire-and-forget成功启动。但在处理HTTP响应后,控制器可能会被释放,这意味着依赖项可能不再存在,因此任务可能无法完成。 为了在触发任务时始终保持依赖项处于活动状态,我们需要创建一个新的服务来包含它,这个新服务必须是单例的,因为单例服务永远不会被释放。我们需要在服务中获取依赖项,而不是在控制器中,因为控制器的生命周期依赖于HTTP上下文,而单例服务则不依赖。 创建一个新类CannonService,并在StartUp.cs的ConfigureServices方法中将其注册为单例。在控制器中使用时,只需将CannonService注入到控制器中,然后调用一个依赖于某些耗时操作的函数。这个方法不会阻塞当前线程,可以直接向客户端返回结果,而发送器在发送邮件时始终保持活动状态。 作者已将上述代码发布为一个Nuget包。你可以在这里查看源代码:[Aiursoft.Canon](https://gitlab.aiursoft.cn/aiursoft/canon/-/tree/master),也可以在这里下载包:[Nuget.org](https://www.nuget.org/packages/Aiursoft.Canon/)。 这篇博客分享了在ASP.NET Core中实现fire and forget的方法,以及如何确保依赖项在任务执行过程中保持活动状态。那么,你是否考虑过在自己的项目中使用这种方法来优化性能呢?--GPT 4