如何在完成异步任务之前等待 24 小时?

How to wait 24hrs before completing an async task?

我正在使用 .NET Framework 制作一个 MVC 应用程序,在我的一个控制器中我调用了一个异步任务,该任务向登录用户发送一封电子邮件。

当用户单击特定复选框并且电子邮件旨在作为一种提醒时调用此任务。

整个任务按预期工作(选中复选框时用户会收到一封电子邮件),但我需要等待 24 小时才能真正发送电子邮件,因为它是一个提醒。

目前电子邮件是立即发送的,如何在代码继续时延迟完成我的 "e-mail task"?

让任务等待 24 小时后再发送邮件。

     await Task.delay(TimeSpan.FromHours(24));

在发送电子邮件之前在您的异步函数中添加这一行

使用像 Hangfire 这样的库,它可以让您安排后台作业并使用持久存储支持它们。

然后您可以轻松地安排工作,例如:

BackgroundJob.Schedule(
    () => SendEmail("user@domain"),
    TimeSpan.FromDays(1));

这是经典X Y Problem。虽然可能会让您的系统等待 24 小时,但您正在创建一个非常脆弱的系统,该系统可能会受到应用程序池重置和服务器重启的影响。

抛开意外重启的可能性不谈,当您的维护周期到来并且计划重启将要发生时会发生什么?您将有多少排队的电子邮件提醒您无能为力?

对于不立即使用其数据的系统,最好的方法是通过某种形式的存储方案对其进行缓冲。它可以像将排队的电子邮件写入系统上的文件一样简单,也可以像具有专用电子邮件发送服务的数据库一样更强大。

这些年来我使用了很多电子邮件发送系统,即使是即时发送,我们也使用了数据库中介,一个专门的电子邮件发送 Windows 服务来生成和发送实际的电子邮件。通过集中生成电子邮件,您不仅可以在一处维护电子邮件发送代码,还可以提高整个系统的耐用性。

如果您的数据库是高可用性集群的一部分,则加分,因为在这种系统中,数据库成为关键点。如果是,那么除了完全网络中断之外,您将免受任何形式的停机时间的影响。