如何等待24小时再完成异步任务?

时间:2019-04-24 11:49:52

标签: c# asp.net-mvc delay

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

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

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

当前电子邮件是立即发送的,如何在代码继续的同时延迟我的“电子邮件任务”的完成?

3 个答案:

答案 0 :(得分:7)

使用Hangfire之类的库,该库可让您安排后台作业并使用持久性存储对其进行备份。

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

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

答案 1 :(得分:1)

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

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

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

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

奖励指向您的数据库是否属于高可用性群集的一部分,因为在这种系统中,数据库成为关键点。如果是这样,则可以保护您免受总网络中断以外的任何形式的停机。

答案 2 :(得分:-1)

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

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

在发送电子邮件之前,将此行添加到异步功能中