【发布时间】:2021-12-14 16:29:14
【问题描述】:
上下文
在 ASP.NET Core 应用程序中,我想执行一个需要 5 秒的操作(例如发送电子邮件)。我确实知道 async/await 及其在 ASP.NET Core 中的用途,但是我不想等待操作结束,而是想立即返回给客户端。
问题
所以无论是自制软件,还是 Hangfire 的 BackgroundJob.Enqueue<IEmailSender>(x => x.Send("hangfire@example.com"));,这有点像“一劳永逸”
假设我有一些更复杂的方法,其中注入了 ILogger 和其他东西,我想触发并忘记该方法。该方法中有错误处理和日志记录。(注意:对于 Hangfire 来说不是必需的,这个问题与后台工作人员的实现方式无关)。我的问题是该方法将完全脱离上下文运行,内部可能没有任何作用,没有 HttpContext(我的意思是 HttpContextAccessor 会给出 null 等)所以没有用户,没有会话等。
问题
如何正确解决这个特定的电子邮件发送问题?没有人愿意等待 5 秒的响应,同时没有人愿意抛出和发送电子邮件,如果发送操作返回错误,甚至不记录......
【问题讨论】:
-
那么,为什么不直接使用 Hangfire 呢?
-
...请重新阅读粗体字,然后是问题...
-
OK.... Hangfire 不需要 HttpContext
-
是我,需要httpcontext,例如知道用户是谁等。同样使用瞬态和作用域实例,当脱离上下文使用时,这些都变成废话
-
然后将该数据包装成一个对象并将其传递给 Hangfire。没有其他安全方法,因为当 HTTP 请求完成时上下文将被释放。
标签: multithreading asp.net-core asynchronous background fire-and-forget