ASP定时器应用程序.净的网页
本文关键字:网页 应用程序 定时器 ASP | 更新日期: 2023-09-27 18:16:37
我正在为办公室创建一个内部网网页。
应用程序需要每5分钟下载一次SMTP电子邮件。(以及其他一些家务)
我刚刚创建了一个ASP。. NET网页,通过Windows 2008 R2服务器在IIS上运行。
我必须创建一个单独的Windows服务来做这个吗?所以我只有两个程序,网页和windows服务?
还是有更好的方法?
创意
在asp.net网站上做重复的东西最简单的方法是
- 在应用程序启动时,创建一个
System.Timers.Timer
对象的实例,并在代码中保持它对静态字段的引用(以防止垃圾收集) - 将其设置为自动复位,并给出您想要的间隔(5min)
- 收听
Elapsed
事件并将您的循环任务放在那里
public class Global : System.Web.HttpApplication
{
private static Timer timer;
protected void Application_Start(object sender, EventArgs e)
{
timer = new Timer(5 * 60 * 1000);
timer.AutoReset = true;
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
}
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
//Get our emails here
}
}
关于app pool recycle
public class Global : System.Web.HttpApplication
{
private static Timer timer;
protected void Application_Start(object sender, EventArgs e)
{
timer = new Timer(5 * 60 * 1000);
timer.AutoReset = true;
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
}
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
//Get our emails here
}
}
没关系:
- 如果你的网站有流量,那么应用程序池将保持
- 如果有时间跨度没有交通,应用程序池可能会停止,但你不关心,因为没有用户抱怨:)
如果它真的很重要,要知道默认情况下,应用程序池被配置为每天只回收一次,即使没有流量也不会停止。
我认为Windows服务是最好的方式。除此之外,你可以设置IIS应用池不回收,并启动一些工作线程,这些线程将在指定的时间间隔内执行任务。
选择第二个可能会更好,一旦你得到正确的,但它必须与IIS基础设施有关,所以你需要设置IIS每次你部署你的应用程序在一个新的服务器上。
如果有人不建议更聪明的东西-我将建议Windows服务(部署时要小心,并确保将CanStop设置为true,以避免在以后部署时重新启动服务器:)和一些媒介(IPC通信,DB,简单文件/xml, Windows服务端的WCF服务或MSMQ)在Web应用程序和Windows服务之间交换数据。
所以回答你的问题-理论上你可以做到这两种方式,但Windows服务似乎更可靠和安全(你不需要以某种方式指示IIS永远不会杀死你的Web进程)。
更简单的方法是创建一个控制台应用程序,并使用任务调度程序每5分钟运行一次
对于我来说,解决方案需要一个控制台应用程序和一个窗口服务。我有一个windows服务,如果控制台应用程序没有运行,它就会启动。它每隔5秒就会查看是否有任何应用程序(存储为注册表项,这样我就可以更新应用程序列表而不必重写服务)正在运行,如果没有,则启动它们。这也使得调试代码更容易,因为我不需要每次都记住如何附加等等来调试windows服务,而只需调试控制台应用程序。控制台应用程序具有连接到DB并执行所需操作的所有必要代码,在我的示例中比较值,然后在必要时发送警报电子邮件。