这篇文章过来讲个小东西,也是大家在日常开发中也经常需要面临的问题:后台定时任务处理。估计大家看到这句就已经联想到 QuartZ 等类似第三方类库了,不好意思,后边的事情和它们没有关系。考虑到简单灵活,满足要求就够的 编程风格. 还是打算自己弄一个.当然这篇文章里不牵扯到具体的持久化, 这个需要按照自己的项目需求去配置.
关于 IHostedService 和 BackgroundService 需要自己百度一下. 相关说明.
Token是一个令牌。当我们对Token执行Cancel()操作时,所有Token的宿主线程(或任务)都将收到取消通知,然后做出线程(或任务)中止执行的操作。
使用CancellationToken的惯常方式如下:
1. 先构造一个CancellationTokenSource实例,这相当于TraceSource,是令牌的生产工厂。CancellationTokenSource有一个属性Token,对应了CancellationToken,这是整个取消架构的核心。
2. 通过设置Token属性的Register()方法,可以注册一个令牌取消后的回调方法。这个方法,在令牌收到取消请求(通知)时被调用。
3. 在线程Start()、任务的TaskFactory、For循环,或其他能带入CancellationToken参数的创造并开启线程的方法中,把前述构造的TokenSource的Token属性返回的令牌对象作为参数传递进去,使该线程成为该Token的宿主之一。
4. 在需要中止线程的时候,只需要调用TokenSource的Cancel()方法,即可向所有令牌发出取消通知,从而中止其宿主线程的执行。收到取消请求,至线程被中止,会有一定的时间延迟。
其实也简单写一个逻辑类 然后使用的时候还需要在中 的ConfigureServices里注册下
using ;
using ;
using System;
using ;
using ;
using ;
using ;
using ;
namespace
{
public class Job : BackgroundService
{
private readonly ILogger<Job> _logger;
public Job(ILogger<Job> logger )
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!)
{
await new TaskFactory().StartNew(() =>
{
try
{
//满足某种条件执行 比如每天凌晨执行
var time = ("HH:mm:ss");
if ("00:01:00" == time)
{
DeleteFile();
_logger.LogError("定时删除:===========成功" );
}
}
catch (Exception e)
{
_logger.LogError("定时删除异常:=============失败====="+);
}
//定时任务休眠
(1 * 1000);
});
}
}
public void DeleteFile() {
string sWebRootFolder = (, "tempExcel");
DirectoryInfo TheFolder = new DirectoryInfo(sWebRootFolder);
FileInfo[] fileInfo = ("*.xlsx");
//获取文件夹中所有文件
if ( > 0)
{
//遍历文件夹中所有文件
foreach (var file in fileInfo)
{
//文件己存在
if ()
{
//删除文件
();
}
}
}
}
}
}
最后在中的ConfigureServices里注册下
//定时任务的注入
<, Job>();
//自动注入定时器开始,//后台任务启动专用.
<, Job>();
//自动注入定时器结束,
这样定时任务就OK了