我需要在ASP.NET MVC站点上重复运行一个任务;它需要每隔时间间隔运行(间隔无关紧要)。
我通过设置Global.asax.cs Application_Start中的后台线程来实现这一点,后者运行任务,休眠时间间隔然后再次运行....再次运行。
虽然这可行,但似乎不是正确的方法,看起来有点hacky。
然后我用Timer对象替换它,这不能可靠地工作 - 似乎其他人也遇到了问题 - 所以我不打算用它。
这需要在MVC站点中运行,它用于从队列中提取作业并从Views准备好发送电子邮件。
我考虑过使用ThreadPool并让上一个工作留下另一份工作,但是因为这些工作可能是长时间运行的工作我已经读过,这可能最终没有留下足够的线程来通过饥饿来处理Web请求
在坚持使用原始线程方法之前,我想我会问其他人是否知道更好的方法。
我希望这是有道理的。实际上,我想要实现的是心跳。在MVC站点中充当生产者/消费者模式的消费者部分的东西。
答案 0 :(得分:9)
Stackoverflow本身使用(或至少习惯使用)这种方法的巧妙方式。见这里:http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/
简而言之,你这样做:
启动时,将项目添加到
HttpRuntime.Cache
并修复 过期。当缓存项目到期时,请执行您的工作,例如WebRequest或具有的内容 您。
- 醇>
使用固定的到期时间将项目重新添加到缓存中。
答案 1 :(得分:0)
我知道你说过:
这需要在MVC网站上运行
但是我认为这是你做的事情的错误地方。
我个人将其设置为Windows服务并让服务检查数据库,根据需要编译电子邮件,并将电子邮件添加到排队服务。然后,电子邮件服务将与此分开,并将按时间间隔发送电子邮件。
目前阻止你使用其他方法而不是将其嵌入MVC网站有什么阻碍?