我正在设计一个ASP.NET 4.0 Web应用程序,管理员可以在其中创建一个过期的拍卖。到期时间将存储在数据库中。考虑到应用程序实例可能在时间不运行的情况下,如何确保拍卖在预定时间结束?该应用程序将与IIS7一起托管。我正在考虑Windows服务,但我想知道其他选项是什么。
答案 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,那么当你获得数十万或数百万的拍卖,以及每分钟数百或数千的开始和结束时,这甚至会窒息。