对于ASP.NET应用程序,我需要定期(每天,每小时等)运行维护过程。
在不依赖于服务器上预定任务之类的外部流程的情况下,实现此目标的最佳方法是什么(假设我无权访问服务器-共享主机环境)。
这是StackOverflow的执行方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| private static CacheItemRemovedCallback OnCacheRemove = null;
protected void Application_Start(object sender, EventArgs e)
{
AddTask("DoStuff", 60);
}
private void AddTask(string name, int seconds)
{
OnCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved);
HttpRuntime.Cache.Insert(name, seconds, null,
DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration,
CacheItemPriority.NotRemovable, OnCacheRemove);
}
public void CacheItemRemoved(string k, object v, CacheItemRemovedReason r)
{
// do stuff here if it matches our taskname, like WebRequest
// re-add our task so it recurs
AddTask(k, Convert.ToInt32(v));
} |
详细信息:http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/
尽管Cache解决方案适用于简单情况,但如果您的日程安排需要更改,您将很不走运。相反,您可以使用Quartz.NET,它是流行的Java框架Quartz的端口,它非常灵活。
如果您不需要按计划的时间执行此操作,而只需要"偶尔一次"清理,则一种方法是在Global.asax Session_OnEnd()中创建一个函数,该函数将创建一个随机变量。 1到100之间的数字,如果数字是50,则执行维护任务。
偏离路线时,您可以减少" 100",以使任务更频繁地发生。
在http://www.codeproject.com/aspnet/ASPNETService.asp上也有标题为"使用ASP.NET模拟Windows服务以运行计划的作业"的文章,该文章使用过期缓存来模拟计时器。它声称它可以在任何托管站点上运行。
如果您使用的是最后一种,请从有关此技术的帖子中阅读此评论:
You need to really be careful on the
length of the task running. Every new
Task is a new Worker Thread and
there’s a limited number of those - as
it"borrows" a thread from the managed
thread pool.
Starting in v3.5 of the Framework the
maximum number of threads was
increased 10x from 25 to 250. But
there’s now a logarithmic startup to
them, so as it doles out more threads
it gets stingier with them. If you run
out of available threads in the
managed thread pool - your response
times are going to go through the
roof.
What you’re really writing here is a
messaging/queuing system.
If you’re doing things like updating
the cache, then by all means - kick
off a new task. If you’re doing
something like downloading a secondary
HTTP resource or some kind of
intensive database work - write a
Windows Service and use a Queue that
allows you more control over how much
you"bite" off each time.
尽管StackOverflow做到这一点的方式绝对是唯一的,但由于涉及到这个问题,您可能还希望监视这个问题。
这是一个外部过程,我不知道它的可靠性如何,但是您可以在始终位于www.webcron.org的计算机上进行类似设置。
基本上,它的作用是按您请求的时间表访问您请求的页面。
从本质上讲,您可以按计划在页面上执行任何操作,从而可以启动维护任务。
Jeff和Joel在最近的播客中还讨论了通过其他方法做类似的事情。