使用Web应用程序管理定时事件的首选方法是什么?

时间:2010-09-28 17:06:48

标签: c# asp.net iis-7 timer

我正在设计一个ASP.NET 4.0 Web应用程序,管理员可以在其中创建一个过期的拍卖。到期时间将存储在数据库中。考虑到应用程序实例可能在时间不运行的情况下,如何确保拍卖在预定时间结束?该应用程序将与IIS7一起托管。我正在考虑Windows服务,但我想知道其他选项是什么。

3 个答案:

答案 0 :(得分:4)

您可以在此处选择两种方案:

  • 懒惰的网络应用程序
  • 使用服务

懒惰场景

除非您必须立即与拍卖的获胜者互动,否则您可以等到应用程序启动,然后让应用程序确定是否有任何过期的拍卖。在那个时刻收集它们并相应地处理它们。

活动场景

创建一个服务,从数据库中选择第一个到期的拍卖。存储DateTime并让服务休眠直到拍卖结束。在该DateTime处提升服务并处理即将到期的拍卖。然后让服务寻找下一个拍卖过期,让服务再次入睡。我一直认为The Windows Workflow Foundation包含了这种做法的所有工具和要求。

介于两者之间

激活一个调度程序,每小时/半小时/ 15分钟唤醒您的web-app并执行懒惰的操作。使用HostMonitor之类的调度程序。

答案 1 :(得分:2)

如果您希望它100%可靠,那么执行所有计划逻辑的Windows服务就是您的选择。正如您所说,您无法信任Web应用程序,因为它甚至可能无法运行。

答案 2 :(得分:2)

处理定时事件的Windows服务将是最佳做法。在ASP.NET中使用System.Threading.Timer是糟糕的juju;它可能在你的情况下工作,因为所做的更改不会直接影响用户界面,但我不会打赌它完美无瑕地工作。如果您需要在Web应用程序的后台安排活动,请使用服务器应用程序。

要记住一件事;您可能一次有数百或数千个公开拍卖。如果您在每次拍卖时设置一个计时器,那么您将拥有由该服务器管理的数百或数千个休眠线程。我只会考虑在您下次正常投票之前结束的拍卖,并仅为这些拍卖设置计时器。这会让你失望,可能是几十个等待线程。但是,如果你正在写下一个eBay,那么当你获得数十万或数百万的拍卖,以及每分钟数百或数千的开始和结束时,这甚至会窒息。