我长期以来一直想到某种自动清理页面执行常规维护任务,并且通过调用带有asp.net页面的1x1像素gif来调用当前页面执行的范围。 src参数。然而,我从未真正决定的一件事是如何处理这样一个页面执行的时间,这样它就不会对每个请求执行,也许就像每隔5个请求一样。或每30分钟或其他一段时间。
您如何考虑建立这样的机制?
答案 0 :(得分:4)
我多次遇到这种情况,我通常最终只使用任务调度程序来调用页面,这样就可以保持一致和可靠。依赖于要调用的页面的问题是您必须确保始终有对页面的请求。如果可以保证,那么只需在应用程序级别存储一个变量,其中包含上次运行任务的时间戳,并让每个页面检查该时间戳,并在请求进入已超过某个阈值时更新它。
答案 1 :(得分:4)
听起来您可能想要使用global.asax文件 - 假设您希望每隔N次发生一次。例如,如果您想为您网站的每第5位访问者做一些事情,您可以采取以下措施:
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
Application["Sessions"] = 0;
}
void Session_Start(object sender, EventArgs e)
{
// Code that runs when a new session is started
Application.Lock();
Application["Sessions"] = (int)Application["Sessions"] + 1;
if ((int)Application["Sessions"] % 5 == 0)
{
DoSomething();
Application["Sessions"] = 0;
}
Application.UnLock();
}
我会强烈推荐这些内容,而不是将脚本附加到GIF文件的来源。你有更多的控制和安全。
答案 2 :(得分:1)
您是否考虑过使用Windows服务?运行清理任务将占用ASP.NET线程池中的一个线程。或者,如果您正在清理SQL Server数据库,那么SQL Server代理作业可能会更好。
答案 3 :(得分:1)
stackoverflow博客中的相关条目:http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/。
其他人:
请注意,如果您缺乏稳定,一致的流量,则一些解决方案无效。如果IIS卸载您的应用程序,则缓存,会话和请求方法不起作用。
如果可以,请为每项服务安装Windows任务服务。制定一个动态添加/删除任务的方案。
如果您的应用是托管的,但无法安装服务,请考虑使用网站监视器点击它 - 例如siteuptime。这使您的应用程序保持在内存中,允许您点击处理程序或操作页面而不是虚拟图像,并让您确切地确定它何时运行。
答案 4 :(得分:0)
我会设置一个计时器并在计时器触发时运行清理任务。如果您希望根据请求数量进行清理,则可以缩短计时器间隔,然后在计时器触发时检查请求计数;如果请求数太少,则跳过清理。