MVC5 延迟事件

本文关键字:事件 延迟 MVC5 | 更新日期: 2023-09-27 18:34:48

一般问题

从我的后端代码中,我想触发事件,这些事件将等待大约 30 分钟,然后运行一些代码。

鉴于在 MVC 中生成线程或任务是一个坏主意(因为池可能会被杀死,而您真的不知道事情是否会起作用(。最好的方法是什么?

我看到的选择是:

  • 从代码创建线程或任务。如上所述的坏主意。
  • 在每 30 分钟调用一次服务的服务器上创建计划任务(批处理/电源外壳(根据需要发送电子邮件。这对我来说很混乱,因为我现在依靠这个任务工作
  • 在 SQL 服务器上创建一个 SSIS 包,以执行与计划任务几乎相同的操作,但可能更可靠。可能是最可靠的解决方案,但也是###中最痛苦的解决方案。

你们会怎么做?

真实世界示例

用户"A"在网站上写评论。用户"B"和"C"都在5分钟内评论这篇文章。我想向用户"A"发送一封关于"B"和"C"的新评论的电子邮件,但我不希望他每次收到 1 封电子邮件。可能有数百个,没有人想要 100 封电子邮件,每封大约 1 条评论。

因此,就我而言,我想触发等待 30 分钟的偶数,然后将所有新评论分组到一封通知电子邮件中。

MVC5 延迟事件

这个问题没有正确的答案,它主要是基于意见的。

就个人而言,我喜欢#2,这对我来说似乎并不混乱。你可以做一些像WorkerRole或WebJob这样的事情。云计算与 Web 请求一样多地涉及定时事件(好吧,也许没有那么多,但它在许多应用程序中仍然发挥着有意义的作用(。

我也喜欢 #2,因为它对我来说似乎更易于单元测试,但也许这是因为我不知道如何针对 SSIS 包编写单元测试。

Web 服务器不是用于计划任务的正确工具。如果没有请求,服务器将在一段时间后进入睡眠状态。我知道你可以做一些黑客来让它工作。但黑客就是黑客,我总是喜欢以正确的方式做事。为此,您需要编写一些 c# 应用程序并使用 Windows 服务或 SQL Server 代理来完成该作业。

在我看来,还有另一种选择。您可以在具有 Web 界面的服务器上公开一些应用程序,以便您可以对某些任务进行排队。然后,该应用程序的内部逻辑可以发送您的电子邮件或执行任何您想要的操作。它不会是MVC Web应用程序,而是一些服务,因此它不会面临被应用程序池回收或其他任何东西杀死的风险。