ASP.NET定时执行任务

本文介绍了一种在ASP.NET环境中实现定时任务的方法:通过创建WebService并由计划任务定期调用的应用程序来完成特定任务。此外,还涉及了使用WINDOWS身份验证访问WebService的安全措施。

项目需要ASP.NET系统中定时执行一些任务。但是WEB系统毕竟不是应用程序,不易实现,最终找到了下面的做法:

1),创建一个WEB SERVICE

2),创建一个应用程序,应用程序一启动就调用Web Service 来完成任务,完成后应用程序关闭。

3),将该应用程序放在计划任务中,定时来运行应用程序。

另:

学习Web Service安全相关知识。

在集成WINDOWS身份验证情况下,用下面方法访问:

ws.Credentials = New NetworkCredential("tester", "password")

ASP.NET中实现定时任务有多种方式和方法,以下是一些常见的实现方式: ### 使用 System.Timers.Timer 类 `System.Timers.Timer` 类可以在指定的时间间隔触发事件。可以在ASP.NET应用程序启动时初始化并启动该定时器,在定时器的 `Elapsed` 事件处理程序中编写需要定时执行任务代码。示例代码如下: ```csharp using System; using System.Timers; public class MyTimerTask { private Timer timer; public MyTimerTask() { // 设置定时器的时间间隔为5000毫秒(即5秒) timer = new Timer(5000); timer.Elapsed += OnTimedEvent; timer.AutoReset = true; timer.Enabled = true; } private void OnTimedEvent(Object source, ElapsedEventArgs e) { // 这里编写定时执行任务代码 Console.WriteLine("定时任务执行,当前时间: " + DateTime.Now); } } ``` ### 使用 System.Threading.Timer 类 `System.Threading.Timer` 类同样可以实现定时任务,它是基于线程池的轻量级定时器。示例代码如下: ```csharp using System; using System.Threading; public class MyThreadingTimerTask { private Timer timer; public MyThreadingTimerTask() { // 延迟3000毫秒(即3秒)后开始执行,之后每5000毫秒(即5秒)执行一次 timer = new Timer(Callback, null, 3000, 5000); } private void Callback(Object state) { // 这里编写定时执行任务代码 Console.WriteLine("定时任务执行,当前时间: " + DateTime.Now); } } ``` ### 使用 Hangfire Hangfire 是一个开源的任务调度库,可用于在ASP.NET应用程序中实现定时任务。它支持多种存储后端(如 SQL Server、Redis 等),可以方便地管理和监控定时任务。以下是一个简单的使用示例: 首先,安装 Hangfire 相关的 NuGet 包。然后在 `Startup.cs` 中进行配置: ```csharp using Hangfire; using Hangfire.SqlServer; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.AddHangfire(configuration => configuration .SetDataCompatibilityLevel(CompatibilityLevel.Version_170) .UseSimpleAssemblyNameTypeSerializer() .UseRecommendedSerializerSettings() .UseSqlServerStorage(Configuration.GetConnectionString("HangfireConnection"))); services.AddHangfireServer(); services.AddControllers(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseHangfireDashboard(); // 定义一个定时任务,每小时执行一次 RecurringJob.AddOrUpdate(() => Console.WriteLine("每小时执行一次的定时任务"), Cron.Hourly); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } } ``` ### 使用 Windows 服务 可以将定时任务封装在一个 Windows 服务中,然后在ASP.NET应用程序中与该服务进行交互。Windows 服务可以在系统启动时自动运行,并且可以通过 `System.Timers.Timer` 或其他定时器类来实现定时执行任务。以下是一个简单的 Windows 服务示例: ```csharp using System; using System.ServiceProcess; using System.Timers; public class MyWindowsService : ServiceBase { private Timer timer; public MyWindowsService() { ServiceName = "MyTimedService"; } protected override void OnStart(string[] args) { timer = new Timer(5000); timer.Elapsed += OnTimedEvent; timer.AutoReset = true; timer.Enabled = true; } protected override void OnStop() { timer.Stop(); timer.Dispose(); } private void OnTimedEvent(Object source, ElapsedEventArgs e) { // 这里编写定时执行任务代码 Console.WriteLine("定时任务执行,当前时间: " + DateTime.Now); } } ``` ### 使用 Quartz.NET Quartz.NET 是一个功能强大的开源任务调度库,支持复杂的定时任务调度,如按日历、按时间间隔等。以下是一个简单的使用示例: 首先,安装 Quartz.NET 相关的 NuGet 包。然后编写以下代码: ```csharp using Quartz; using Quartz.Impl; using System; using System.Threading.Tasks; public class MyQuartzJob : IJob { public Task Execute(IJobExecutionContext context) { // 这里编写定时执行任务代码 Console.WriteLine("定时任务执行,当前时间: " + DateTime.Now); return Task.CompletedTask; } } public class QuartzScheduler { public async Task Start() { // 创建调度器工厂 ISchedulerFactory schedFact = new StdSchedulerFactory(); // 获取调度器实例 IScheduler sched = await schedFact.GetScheduler(); // 启动调度器 await sched.Start(); // 创建作业 IJobDetail job = JobBuilder.Create<MyQuartzJob>() .WithIdentity("myJob", "group1") .Build(); // 创建触发器,每5秒执行一次 ITrigger trigger = TriggerBuilder.Create() .WithIdentity("myTrigger", "group1") .StartNow() .WithSimpleSchedule(x => x .WithIntervalInSeconds(5) .RepeatForever()) .Build(); // 将作业和触发器添加到调度器 await sched.ScheduleJob(job, trigger); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值