使用ASP.NET实现Windows Service定时执行任务
我们怎样才能在服务器上使用asp.net定时执行任务而不需要安装windows service?我们经常需要运行一些维护性的任务或者像发送提醒邮件给用户这样的定时任务。这些仅仅通过使用Windows Service就可以完成。Asp.net通常是一个无状态的提供程序,不支持持续运行代码或者定时执行某段代码。所以,我们不得不构建自己的windows service来运行那些定时任务。但是在一个共享的托管环境下,我们并不总是有机会部署我们自己的windwos service到我们托管服务提供商的web服务器上。我们要么买一个专用的服务器,当然这是非常昂贵的,要么就牺牲我们网站的一些功能。然而,运行一个定期执行的任务是一个非常有用的功能,特别是对那些需要发送提醒邮件的用户、需要维护报表以及运行清理操作的的管理员而言。我将给你展示一种无须使用任何windows service,仅仅采用asp.net来运行定期任务的方式。
它怎样工作
首先,我们需要asp.net中的某些“场景”,能够持续不断地运行并且给我们一个回调。而IIS上的web服务器就是一个很不错的选择。所以,我们需要从它那里很“频繁”地获得回调,这样我们可以查看一个任务队列,并且能够看到是否有任务需要执行。现在,这里有一些方式可以为我们获得对web服务器的“操作权”:
(1) 当一个页面被请求
(2) 当一个应用程序被启动
(3) 当一个应用程序被停止
(4) 当一个会话开启、结束或者超时
(5) 当一个缓存项失效
一个页面被请求是随机的。如果几个小时内没有人访问你的站点,那么几个小时内你都无法完成任何“任务”。另外,一个请求的执行时间是非常短的,并且它本身也需要越快越好。如果你计划在页面请求的时候执行“计划任务”,这样页面将会被迫执行很长时间,这将导致一个很糟糕的用户体验。所以,选择在页面请求的时机做这样的操作不是一个好的选择。
一个页面被请求是随机的。如果几个小时内没有人访问你的站点,那么几个小时内你都无法完成任何“任务”。另外,一个请求的执行时间是非常短的,并且它本身也需要越快越好。如果你计划在页面请求的时候执行“计划任务”,这样页面将会被迫执行很长时间,这将导致一个很糟糕的用户体验。所以,选择在页面请求的时机做这样的操作不是一个好的选择。
当一个应该程序启动时,Global.asax内的Application_Start方法给我们提供了一个回调。所以这是一个开启后台线程的好地方,后台线程可以永久运行以执行“计划任务”。然而,当该线程在web服务器由于零负载而“休息”一会儿的时候,却可能被随时“杀死”。
当一个应用程序停止的时候,我们同样可以从Application_End方法获得一个回调。但是我们在这里却不能做任何事情,因为整个应该程序都已经快要结束运行了。Global.asax里的Session_Start会在当一个用户访问一个需要被实例化为新会话的页面时被触发。所以这也是一个随机事件。而我们需要一个能持久且定期运行的“场景”。
一个缓存项的失效可以提供一个时间点或持续时间。在asp.net中你可以在Cache对象中增加一个实体,并且可以设置一个绝对失效时间,或者设置当其被从缓存中移除后失效。你可以利用下面的Cache类中的方法来做这些:
[csharp]
public void Insert ( System.String key , System.Object value ,
System.Web.Caching.CacheDependency dependencies ,
System.DateTime absoluteExpiration ,
System.TimeSpan slidingExpiration ,
System.Web.Caching.CacheItemPriority priority ,
System.Web.Caching.CacheItemRemovedCallback onRemoveCallback )
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/70598.html