MVC5延迟事件

时间:2014-12-19 18:20:17

标签: c# asp.net-mvc-5

一般问题

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

鉴于在MVC中生成线程或任务是一个坏主意(因为池可以被杀死,而你真的不知道事情是否会起作用)。这样做的最佳方式是什么?

我看到他们的选择是:

  • 从代码中创建一个线程或任务。如上所述的坏主意。
  • 在每30分钟调用一次服务的服务器上创建一个计划任务(batch / powershell) 根据需要发送电子邮件。 这对我来说很麻烦,因为我现在依赖这项工作
  • 在SQL服务器上创建一个SSIS包,与计划任务完全相同,但可能更可靠。 可能是最可靠的解决方案,但也是### one中最痛苦的。

你们会做什么?

真实世界的例子

用户“A”在网站上发表评论。用户“B”和“C”都会在5分钟内对此帖发表评论。我想向用户“A”发送一封关于“B”和“C”的新评论的电子邮件,但我不希望他为每个提交收到1封电子邮件。可能有数百封,没有人想要100封电子邮件每个评论1条。

所以在我的情况下,我想触发一个等待30分钟的偶数,然后将所有新评论分组到一个通知电子邮件中。

3 个答案:

答案 0 :(得分:2)

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

我个人喜欢#2,它对我来说似乎并不凌乱。你可以做一些像WorkerRole或WebJob。云计算与Web请求一样关于定时事件(好吧可能没那么多,但它在许多应用程序中仍扮演着有意义的角色)。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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