如何根据应用程序计时器在服务器上执行方法?

时间:2012-04-19 19:10:15

标签: c# asp.net-mvc iis

我是一个相对较新的开发人员,但我正在开发一个聚合多个XML文件的应用程序。对于一个特定的控制器,大约25次调用基于REST的远程服务,完成所有调用大约需要5-7秒,解析数据并返回视图。我正在缓存控制器的结果30分钟。

我想要避免的是用户在缓存过期时必须等待7秒。所以,我的想法是每半小时执行一个方法,将XML文件聚合到一个本地文件,然后可以查询该文件。因此,控制器将不再直接调用服务,而只是调用存储的文件。

我可以远程访问IIS,因此无法以这种方式设置任务。它必须是一个应用层解决方案。建议?

4 个答案:

答案 0 :(得分:3)

您可以使用Quartz.NET,一种调度服务。它可以在嵌入模式下运行(在IIS应用程序池的进程下运行,应该可以使用您的应用程序轻松部署),也可以作为独立服务运行。 如果这很重要,后者更可靠,因为应用程序池经常循环(默认情况下每29小时,或在某个空闲时间之后,或者如果服务器重新启动,或任何数量的事件)......并且您需要手动访问该网站以启动应用程序池(除非您自动启动)。

但是,听起来你的任务并不那么重要......所以我强烈考虑去嵌入Quartz.net这里有几个例子:

您还可以考虑Windows任务计划程序。

答案 1 :(得分:1)

理论上,您可以在Global.asax中启动几个线程,这些线程将能够异步获取数据,然后将这些线程放入ASP.NET缓存中。只需确保您创建的线程不会从Thread Pool for ASP.NET中弹出。您可以通过将任务状态设置为LongRunning来使用TPL执行此操作。

答案 2 :(得分:0)

这不是一个好的设计,但你可以通过windows服务创建xml文件到本地文件夹,你的asp.net mvc应用程序访问windows服务写的xml文件。

答案 3 :(得分:0)

我会考虑创建一个在您的服务器上运行的Windows服务(而不是Web服务)并为您处理更新。它可以将后处理数据存储在控制器可以调用的数据库中。这会将Web应用程序与解析数据的工作分离,并允许您在服务上使用计时器并使Web应用程序更清洁。