.NetCore里使用定时任务

在.NET Core中,实现定时任务可以通过多种方式,包括使用内置的System.Threading.TimerSystem.Timers.Timer,或者更高级、更灵活的库,如HangfireQuartz.NET或.NET Core 3.0及以上版本引入的IHostedServiceBackgroundService。这里主要介绍IHostedServiceBackgroundService的方式,因为它们是.NET Core官方推荐的用于实现后台服务和定时任务的方法。

使用IHostedServiceBackgroundService

IHostedService是一个接口,它定义了一个StartAsyncStopAsync方法,使得类能够以受控的方式启动和停止。BackgroundService是一个抽象类,它实现了IHostedService接口,并提供了一个方便的ExecuteAsync方法来执行后台操作。

步骤1: 创建定时任务服务

首先,你需要创建一个继承自BackgroundService的类,并在ExecuteAsync方法中实现你的定时逻辑。

cs 复制代码
using Microsoft.Extensions.Hosting;  
using System;  
using System.Threading;  
using System.Threading.Tasks;  
  
public class TimedBackgroundService : BackgroundService  
{  
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)  
    {  
        while (!stoppingToken.IsCancellationRequested)  
        {  
            // 这里是你的定时任务逻辑  
            Console.WriteLine($"任务执行于: {DateTime.Now}");  
  
            // 等待一段时间再执行下一次  
            await Task.Delay(TimeSpan.FromSeconds(10), stoppingToken);  
        }  
    }  
}
步骤2: 在Startup.csProgram.cs中注册服务

如果你使用的是.NET Core 3.x或更早版本,你可能需要在Startup.csConfigureServices方法中注册你的服务。而在.NET 5或更高版本中,你可能会在Program.cs中使用Program.CreateHostBuilder方法来完成注册。

cs 复制代码
// .NET Core 3.x 示例  
public void ConfigureServices(IServiceCollection services)  
{  
    services.AddHostedService<TimedBackgroundService>();  
    // 其他服务配置...  
}  
  
// .NET 5 或更高版本 示例  
public class Program  
{  
    public static void Main(string[] args)  
    {  
        CreateHostBuilder(args).Build().Run();  
    }  
  
    public static IHostBuilder CreateHostBuilder(string[] args) =>  
        Host.CreateDefaultBuilder(args)  
            .ConfigureServices((hostContext, services) =>  
            {  
                services.AddHostedService<TimedBackgroundService>();  
                // 其他服务配置...  
            });  
}
注意事项
  • 使用BackgroundServiceIHostedService时,你的应用需要保持运行,以便定时任务能够持续执行。
  • 可以通过stoppingToken来优雅地停止服务,这通常在应用关闭时发生。
  • 如果你的定时任务需要更复杂的调度(如CRON表达式),你可能需要查看如Quartz.NET这样的库。
  • Task.Delay用于在两次任务执行之间等待,这是非阻塞的,允许线程执行其他任务。
相关推荐
Aaron - Wistron5 小时前
Web API C# (Furion版)带 单元测试
开发语言·后端·c#
骊城英雄7 小时前
基于C#+avalonia ui实现的跨平台点胶机灌胶监控控制上位机软件
开发语言·ui·c#
吾儿良辰7 小时前
一个被BCL遗忘的高性能集合:C# CircularBuffer<T>深度解析
开发语言·windows·c#
哎呦喂我去去去7 小时前
C#实现屏幕墙:同时监控多个电脑桌面(支持Windows、信创Linux、银河麒麟、统信UOS)
linux·windows·c#
caishenzhibiao8 小时前
期货先行者主图 同花顺期货通指标
java·c语言·c#
库拉库拉里8 小时前
Word文档的标题总是自动出现首行缩进怎么办?
c#·word·xhtml
在世修行8 小时前
从零打造 C# 工业视觉检测系统(一):项目全景与架构设计
c#·视觉检测
牡丹雅忻110 小时前
AES 加密模式演进:从 ECB、CBC 到 GCM 的 C# 深度实践
java·开发语言·c#
脚踏实地皮皮晨10 小时前
002002002_DepandencyObject类2
开发语言·windows·算法·c#·visual studio
YUS云生11 小时前
大模型学习·第41天:LangChain进阶——提示词模板与Chain链式调用
学习·langchain·c#