今天我们为我们的ASP.NET网站构建了一个控制台应用程序来运行定期任务。但我认为这种方法有些容易出错且难于维护。你是如何在Windows/IIS/ASP.NET环境中执行计划任务的?
更新:
任务示例:
- 从数据库中的电子邮件队列发送电子邮件
- 从数据库中移除过时的对象
- 从Google AdWords检索统计信息并填充数据库中的表格。
今天我们为我们的ASP.NET网站构建了一个控制台应用程序来运行定期任务。但我认为这种方法有些容易出错且难于维护。你是如何在Windows/IIS/ASP.NET环境中执行计划任务的?
更新:
任务示例:
Jeff Atwood提出的这种技术是我遇到的最简单的方法。它依赖于内置在ASP.NET缓存系统中的“缓存项已移除”回调机制。
更新:Stackoverflow已经超越了这种方法。它只在网站运行时有效,但对许多人来说这是一个非常简单实用的技术。
还要查看Quartz.NET
创建一个自定义的Windows服务。
我之前将一些业务关键任务设置为定时控制台应用程序,但发现难以维护。因此我创建了一个带有“心跳”的Windows服务,每隔几分钟便会检查数据库中的计划任务。这种方式运转效果非常好。
尽管如此,对于大多数非关键性维护任务,我仍使用定时控制台应用程序。如果它没有出问题,就不要去修复它。
我认为这对所有人都很容易:
使用这种方法,所有业务逻辑都包含在您的 Web 应用程序中,但您可以依靠 Windows 任务管理器或任何其他商业任务管理器来启动它并记录任何返回信息,例如执行报告。与发布到页面相比,使用 Web 服务具有一定的优势,因为从 Web 服务获取返回数据更容易。
protected void Application_Start()
{
Thread thread = new Thread(new ThreadStart(ThreadFunc));
thread.IsBackground = true;
thread.Name = "ThreadFunc";
thread.Start();
}
protected void ThreadFunc()
{
System.Timers.Timer t = new System.Timers.Timer();
t.Elapsed += new System.Timers.ElapsedEventHandler(TimerWorker);
t.Interval = 10000;
t.Enabled = true;
t.AutoReset = true;
t.Start();
}
protected void TimerWorker(object sender, System.Timers.ElapsedEventArgs e)
{
//work args
}
Request.IsLocal
>> 只有服务器本身才能运行计划任务,其他人无法运行。 - The Conspiracy此外,如果您的应用程序使用SQL SERVER,可以使用SQL Agent来安排任务。这是我们通常放置基于数据驱动的重复代码(例如电子邮件提醒、定期维护、清除等)的地方。 SQL Agent内置了一个很棒的功能,即故障通知选项,可以在关键任务失败时向您发出警报。