【问题标题】:ASP.NET MVC Repeating TaskASP.NET MVC 重复任务
【发布时间】:2011-06-27 10:05:50
【问题描述】:

我需要在 ASP.NET MVC 站点上重复运行一个任务;它需要每隔时间间隔运行一次(时间间隔无关紧要)

我通过从 Global.asax.cs Application_Start 中设置一个后台线程来实现这一点,该线程运行任务,休眠 时间间隔,然后再次运行......再次运行。

虽然这行得通,但它似乎不是正确的方法,似乎有点 hacky。

然后我用 Timer 对象替换它,这不能可靠地工作 - 似乎其他人也有问题 - 所以我不打算使用它。

这需要在 MVC 站点中运行,它用于从队列中提取作业并从视图中呈现它们以准备发送电子邮件。

我曾考虑过使用 ThreadPool 并让之前的作业留下另一个作业,但由于这些作业可能是长时间运行的作业,我已经读到这可能最终导致没有足够的线程来处理因饥饿而产生的 Web 请求.

在坚持使用原始线程方法之前,我想我会问是否有人知道这样做的更好方法。

我希望这是有道理的。实际上,我想要实现的是心跳。在 MVC 站点中充当生产者/消费者模式的消费者部分的东西。

【问题讨论】:

    标签: asp.net-mvc multithreading


    【解决方案1】:

    Stackoverflow 本身使用(或至少曾经使用)一种巧妙的方式来做到这一点。见这里:https://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

    简而言之,您可以这样做:

    1. 在启动时,将一个项目添加到HttpRuntime.Cache,并带有一个固定的 过期。

    2. 当缓存项过期时,做你的工作,例如 WebRequest 或什么有 你。

    3. 将项目重新添加到具有固定过期时间的缓存中。

    【讨论】:

    【解决方案2】:

    我知道你说过:

    这需要在 MVC 站点中运行

    但是我认为这是做你想要实现的目标的错误地方。

    我个人将其设置为 Windows 服务,并让该服务检查数据库,根据需要编译电子邮件,并将电子邮件添加到排队服务。然后,电子邮件服务将与此分开,并会在某个时间间隔发送电子邮件。

    目前是什么阻止您使用其他方法而不是将其嵌入到您的 MVC 站点中?

    【讨论】:

    • 我知道你在说什么,我也想过同样的事情。想要创建一个新的 Windows 服务似乎是一件很简单的事情,实现它似乎有点麻烦,这是另一件事可能出错,等等。另外,如果你无法访问怎么办盒子?因为需要聚合的外部源是异步访问的,所以它不会使服务器过载,不需要在外部完成。
    • 我想我会在上面添加 HttpRuntime.Cache 建议。我只是想有时间快速而肮脏地启动和运行。如果网站达到了不再足够好的程度,那么它可能会在那个时候被货币化,值得重写并实施适当的解决方案。不过还是谢谢你的回答。
    • 很高兴能帮助克雷格。祝您创业顺利!
    猜你喜欢
    • 2017-08-12
    • 2010-11-30
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 2013-01-09
    • 2018-09-07
    • 2010-10-02
    • 1970-01-01
    相关资源
    最近更新 更多