ASP.NET 定时启动服务器
在现代Web应用开发中,定时任务是一个常见需求,定期备份数据库、发送提醒邮件等,本文将详细介绍如何在ASP.NET中实现定时任务的启动和管理,包括使用System.Timers命名空间和缓存机制。

一、使用System.Timers命名空间
1、导入命名空间:首先需要在Global.asax文件中导入System.Timers命名空间。
<%@ Import Namespace="System.Timers" %>
2、创建并配置计时器:在Global.asax的Application_Start方法中创建并配置计时器。
System.Timers.Timer objTimer = new Timer(); objTimer.Interval = 60000; // 设置时间间隔为60秒 objTimer.Enabled = true; objTimer.Elapsed += new ElapsedEventHandler(objTimer_Elapsed);
3、定义事件处理方法:创建一个方法来处理计时器触发的事件。
void objTimer_Elapsed(object sender, ElapsedEventArgs e)
{
// 在这里编写定时执行的任务逻辑
}
二、使用缓存机制
1、注册缓存项:在Application_Start方法中注册一个缓存项,并设置其失效时间为两分钟后。

private const string DummyCacheItemKey = "GagaGuguGigi";
protected void Application_Start(Object sender, EventArgs e)
{
RegisterCacheEntry();
}
private bool RegisterCacheEntry()
{
if (null != HttpContext.Current.Cache[DummyCacheItemKey]) return false;
HttpContext.Current.Cache.Add(
DummyCacheItemKey, "Test", null,
DateTime.MaxValue, TimeSpan.FromMinutes(2),
CacheItemPriority.Normal,
new CacheItemRemovedCallback(CacheItemRemovedCallback));
return true;
}
2、定义缓存项移除回调方法:当缓存项失效时调用的方法。
public void CacheItemRemovedCallback(string key, object value, CacheItemRemovedReason reason)
{
// 在这里编写定时执行的任务逻辑
DoWork();
}
3、重新注册缓存项:为了持续运行任务,需要再次注册缓存项。
public void DoWork()
{
// 执行计划任务
Debug.WriteLine("Cache item callback: " + DateTime.Now.ToString());
RegisterCacheEntry(); // 重新注册缓存项以保持循环
}
三、解决IIS自动回收问题
为了避免IIS自动回收导致后台任务终止,可以在任务关闭时通过HTTP请求重新唤醒服务。
1、修改Dispose方法:在Dispose方法中添加代码以重新唤醒服务。
public void Dispose()
{
_timer?.Dispose();
Thread.Sleep(5000);
HttpHelper.HttpGet(_configuration["AwakenUrl"]); // 发送HTTP请求以重新唤醒服务
}
2、配置唤醒URL:在appsettings.json中配置唤醒URL。

"AwakenUrl": "http://example.com/AwakenService"
3、创建唤醒服务:创建一个API端点用于接收唤醒请求。
[HttpGet]
public IActionResult AwakenService()
{
return Ok();
}
四、示例代码汇总
以下是一个完整的示例,展示了如何使用System.Timers命名空间和缓存机制来实现定时任务,并解决IIS自动回收问题。
// Global.asax.cs
using System;
using System.Timers;
using System.Web;
using System.Web.Caching;
public class MvcApplication : System.Web.HttpApplication
{
private static System.Timers.Timer objTimer;
private const string DummyCacheItemKey = "GagaGuguGigi";
protected void Application_Start()
{
objTimer = new System.Timers.Timer();
objTimer.Interval = 60000; // 设置时间间隔为60秒
objTimer.Enabled = true;
objTimer.Elapsed += new ElapsedEventHandler(objTimer_Elapsed);
RegisterCacheEntry();
}
private bool RegisterCacheEntry()
{
if (null != HttpContext.Current.Cache[DummyCacheItemKey]) return false;
HttpContext.Current.Cache.Add(
DummyCacheItemKey, "Test", null,
DateTime.MaxValue, TimeSpan.FromMinutes(2),
CacheItemPriority.Normal,
new CacheItemRemovedCallback(CacheItemRemovedCallback));
return true;
}
public void objTimer_Elapsed(object sender, ElapsedEventArgs e)
{
// 在这里编写定时执行的任务逻辑
}
public void CacheItemRemovedCallback(string key, object value, CacheItemRemovedReason reason)
{
// 在这里编写定时执行的任务逻辑
DoWork();
}
public void DoWork()
{
// 执行计划任务
Debug.WriteLine("Cache item callback: " + DateTime.Now.ToString());
RegisterCacheEntry(); // 重新注册缓存项以保持循环
}
protected void Application_End()
{
objTimer.Dispose();
Thread.Sleep(5000);
HttpHelper.HttpGet(_configuration["AwakenUrl"]); // 发送HTTP请求以重新唤醒服务
}
}
上述代码实现了一个简单的定时任务系统,利用ASP.NET中的System.Timers命名空间和缓存机制,确保即使在IIS自动回收的情况下也能持续运行,这种方法适用于不需要部署Windows服务的场景,是一种轻量级的解决方案。
以上就是关于“asp.net 定时 启动服务器”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!