【问题标题】:ASP.NET Core - Send email without waitASP.NET Core - 无需等待即可发送电子邮件
【发布时间】:2022-08-17 05:04:20
【问题描述】:

我有一个 APS.NET Core 5 Web API:

我有这个:

await _mailSender.SendMailAsync(entity.Id);

但是,我不想等待电子邮件发件人返回确定为客户。 我想继续执行代码并在后台发送电子邮件。

我怎样才能做到这一点?

  • 您可以稍后在代码中等待它。但是要小心即发即弃,例如一个依赖被清理。
  • @Jeppe 抱歉,但我不明白。
  • await 从这个线程的角度来看,在继续之前等待电子邮件发送,例如完成 api 请求。删除await,它会立即继续完成api-request。但是注入的服务有生命周期——所以如果_mailSender 依赖于一个作用域服务,我认为在你完成之前这种依赖就有被清理的风险。您可以创建一个EmailQueue 单例,您可以在其上将任务排入队列。然后它可以维护自己的依赖生命周期。
  • @Jeppe 我现在明白了!你能给我发一个 EmailQueue 单例示例吗?
  • 仅供参考,当您将电子邮件提交到他们的 API 时,SendGrid 会将您的电子邮件排队,然后返回“Ok”。不久之后 SendGrid 将实际发送电子邮件。因此,您并不是真的在等待发送电子邮件。不确定这是否会改变您对等待的想法,但想确保您知道!

标签: asp.net-core asp.net-core-webapi sendgrid


【解决方案1】:

通过使用Task 类,您可以异步执行单个操作。

试试这个代码:

 System.Threading.Tasks.Task.Run(() => _mailSender.SendMailAsync(entity.Id).Result;

Task 对象执行的工作通常在线程池线程上异步执行,而不是在主应用程序线程上同步执行。

【讨论】:

    【解决方案2】:

    我使用 HangFire 将要发送的电子邮件排队。

    //send email
    BackgroundJob.Enqueue(() => _mailSender.SendMailAsync(entity.Id));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-03
      • 1970-01-01
      • 2021-11-19
      • 2019-11-27
      • 2017-07-22
      • 1970-01-01
      • 2016-07-28
      • 1970-01-01
      相关资源
      最近更新 更多