C# 如何在服务器上执行基于应用程序计时器的方法?

C# 如何在服务器上执行基于应用程序计时器的方法?,c#,asp.net-mvc,iis,C#,Asp.net Mvc,Iis,我是一个相对较新的开发人员,但我正在开发一个聚合多个XML文件的应用程序。对于一个特定的控制器,大约有25个对基于REST的远程服务的调用,完成所有调用、解析数据和返回视图大约需要5-7秒。我将控制器的结果缓存30分钟 我想要避免的是,当缓存过期时,用户必须等待7秒。因此,我的想法是每半小时执行一个方法,将XML文件聚合为一个本地文件,然后可以查询该文件。因此,控制器不再直接调用服务,而只是调用存储的文件 我可以远程访问IIS,因此无法以这种方式设置任务。它必须是一个应用层解决方案。建议?这不是

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

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


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

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

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

理论上,您可以在Global.asax中启动几个线程,这些线程将能够异步获取数据,然后将它们放入ASP.NET缓存中。只需确保您创建的线程不会从ASP.NET的线程池中弹出即可。通过将任务状态设置为
LongRunning
,您应该能够通过TPL实现这一点

理论上,您可以在Global.asax中启动几个线程,这些线程将能够异步获取数据,然后将它们放入ASP.NET缓存中。只需确保您创建的线程不会从ASP.NET的线程池中弹出即可。通过将任务状态设置为
LongRunning
,您应该能够通过TPL实现这一点

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

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

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

然而,听起来你的任务并不是那么关键。。。因此,我将强烈地考虑嵌入Quas.NET。这里有几个例子:


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

然而,听起来你的任务并不是那么关键。。。因此,我将强烈地考虑嵌入Quas.NET。这里有几个例子:

您也可以考虑Windows任务调度器。