ASP.NET网页的计时器应用程序

时间:2011-12-03 09:13:01

标签: c# asp.net iis

我正在为我的办公室创建一个Intranet网页。

应用程序需要每5分钟下载一次SMTP电子邮件。 (以及其他一些管家事务)

我刚刚创建了一个通过Windows 2008 R2服务器在IIS上运行的ASP.NET网页。

我是否必须创建单独的Windows服务才能执行此操作?所以我只有2个程序,网页和Windows服务?

还是有更好的方法吗?

4 个答案:

答案 0 :(得分:4)

想法

在asp.net网站上重复播放内容的最简单方法是

  • 在应用程序启动期间,创建一个System.Timers.Timer对象的实例,并将其引用到代码中的 static 字段(以防止垃圾回收)
  • 将其设置为自动重置并为其提供所需的时间间隔(5分钟)
  • 聆听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
    }
}

关于应用程序池回收

没关系:

  • 如果您的网站有流量,那么应用池就会保持不变
  • 如果有时间跨度没有流量,应用程序池可能会停止,但您不关心,因为没有用户抱怨:)

如果真的很重要,请知道默认情况下,应用程序池配置为每天只回收一次,即使没有流量也不会停止。

答案 1 :(得分:0)

我认为Windows服务是最好的方式。 除此之外,您可以设置IIS应用程序池不要回收并启动一些将在指定时间间隔执行任务的工作线程。

选择第二个可能会更好,一旦你做对了,但它将与IIS基础结构有关,因此每次在新服务器上部署应用程序时都需要设置IIS。

如果有人不建议更聪明的东西 - 我会建议Windows服务(部署它时要小心,并确保将CanStop设置为true以避免在以后的部署中重新启动服务器:)和某些介质( IPC通信,数据库,简单文件/ xml,Windows服务端的WCF服务或MSMQ),以在Web应用程序和Windows服务之间交换数据。

所以回答你的问题 - 你可以从理论上做到这两点,但Windows服务似乎更可靠和安全(你不需要以某种方式指示IIS永远不会杀死你的Web进程)。

答案 2 :(得分:0)

更简单的方法是创建一个控制台应用程序并使用任务计划程序每5分钟运行一次

答案 3 :(得分:0)

对我来说,解决方案需要一个控制台应用程序一个Window Service。我有一个Windows服务,如果它们没有运行,它只是启动控制台应用程序。看起来任何应用程序(存储为注册表项,因此我可以更新应用程序列表而不必重写服务)看起来是5秒,如果它们不运行,那么它们就会启动。这也使代码更容易调试,因为我不必记住如何连接等,每次调试Windows服务,只需调试控制台应用程序。控制台应用程序具有连接到数据库并执行所需操作的所有必要代码,在我的情况下比较值,然后在必要时发送警报电子邮件。