Asp.net Core Hosted Service(托管服务) Timer (定时任务)
Hosted Service 托管服务 要继承 IHostedService 或继承 BackgroundService
》》》定义一个后台托管服务
/// <summary>
/// 自定义后台任务类
/// </summary>
public class MyHostedService : BackgroundService
{
/// <summary>
/// 执行任务
/// </summary>
/// <param name="stoppingToken"></param>
/// <returns></returns>
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
int i = 1;
//如果没停止,就一直执行
while (!stoppingToken.IsCancellationRequested)
{
DoWork(i++);
}
return Task.CompletedTask;
}
/// <summary>
/// 打印输出一句话
/// </summary>
/// <param name="i"></param>
private void DoWork(int i)
{
Console.WriteLine("后台任务执行MyHostedService,第{0}次", i);
}
}
》》》注册服务
//.NET6中的Program.cs中注册后台任务
builder.Services.AddHostedService<MyHostedService>();
Timer System.Threading.Timer是一个非常常用的定时器类,是一个使用回调方法的计时器,而且由线程池线程服务,简单且对资源要求不高。
core 中的 timer 跟 Window Form 中的 timer 不一样
window Form timer 命名空间 System.Windows.Forms
//以下演示如何使用Timer类
using System;
using System.Threading;
public class TestTimer
{
/// <summary>
/// 定时器
/// </summary>
private Timer _iTimer;
/// <summary>
/// 构造方法
/// </summary>
public TestTimer()
{
_iTimer = new Timer(Doing,null,TimeSpan.Zero, TimeSpan.FromMinutes(5));
}
/// <summary>
/// 执行具体定定时任务
/// </summary>
/// <param name="nObject"></param>
public void Doing(object nObject)
{
//具体代码。。
}
}
托管服务 + Timer
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection; //IServiceProvider接口的命名空间
using XfTechOAWeb.Application.Interfaces; //应用服务接口的命名空间
namespace XfTechOAWeb.ApiServer.Background
{
/// <summary>
/// 定时服务
/// </summary>
public class TimedHostedService : BackgroundService
{
private readonly IServiceProvider _serviceP;
private Timer _timer; //定时器
/// <summary>
/// 构造方法
/// </summary>
/// <param name="scopeFactory"></param>
public TimedHostedService(IServiceProvider serviceP)
{
_serviceP = serviceP;
}
/// <summary>
/// 执行任务
/// </summary>
/// <param name="stoppingToken"></param>
/// <returns></returns>
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(10*60)); //定时器创建后马上执行,每10分钟执行一次
return Task.CompletedTask;
}
/// <summary>
/// 定时器具体执行的方法
/// </summary>
/// <param name="state"></param>
private void DoWork(object state)
{
//创建服务作用域
using(var scope = _serviceP.CreateScope())
{
//IOrderService 的实现代码 略
var orderService = scope.ServiceProvider.GetRequiredService<IOrderService>();
//检查订单是否已支付,超过10分钟未支付订单自动关闭
orderService.CheckOrderPayment();
}
}
/// <summary>
/// 释放资源
/// </summary>
public override void Dispose()
{
_timer?.Dispose(); //如果_timer对象不为null,则销毁
base.Dispose();
}
}
}
》》》创建服务》》》
builder.Services.AddHostedService<TimedHostedService>(); //注册托管服务--定时任务
builder.Services.AddScoped<IOrderService, OrderService>(); //注册订单服务--有作用域的服务