.net core 定时任务

61 篇文章 11 订阅

        这篇文章过来讲个小东西,也是大家在日常开发中也经常需要面临的问题:后台定时任务处理。估计大家看到这句就已经联想到 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()方法,即可向所有令牌发出取消通知,从而中止其宿主线程的执行。收到取消请求,至线程被中止,会有一定的时间延迟。

其实也简单写一个逻辑类    然后使用的时候还需要在startup.cs中 的ConfigureServices里注册下

using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace Test.Web.Host.Model
{
    public class Job : BackgroundService
    {
        private readonly ILogger<Job> _logger;
        public Job(ILogger<Job> logger )
        {
            _logger = logger; 
        }
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {

            while (!stoppingToken.IsCancellationRequested)
            {
                await new TaskFactory().StartNew(() =>
                {
                    try
                    { 
                        //满足某种条件执行 比如每天凌晨执行
                        var time = DateTime.Now.ToString("HH:mm:ss");
                        if ("00:01:00" == time)
                        {
                            DeleteFile();
                            _logger.LogError("定时删除:===========成功" );
                        } 
                    }
                    catch (Exception e)
                    {
                        _logger.LogError("定时删除异常:=============失败====="+e.Message); 
                    }

                    //定时任务休眠
                    Thread.Sleep(1 * 1000);
                });
            } 
        }
        public void DeleteFile() {

            string sWebRootFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tempExcel");
            DirectoryInfo TheFolder = new DirectoryInfo(sWebRootFolder);
            FileInfo[] fileInfo = TheFolder.GetFiles("*.xlsx");
            //获取文件夹中所有文件
            if (fileInfo.Length > 0)
            { 
                //遍历文件夹中所有文件
                foreach (var file in fileInfo)
                {
                    //文件己存在
                    if (file.Exists)
                    { 
                        //删除文件
                        file.Delete();
                    }
                } 
            } 
        }
    }
}

最后在startup.cs中的ConfigureServices里注册下

//定时任务的注入
services.AddTransient<Microsoft.Extensions.Hosting.IHostedService, Job>();

            //自动注入定时器开始,//后台任务启动专用.   
            services.AddTransient<Microsoft.Extensions.Hosting.IHostedService, Job>();
            //自动注入定时器结束,

这样定时任务就OK了

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香煎三文鱼

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值