首页 > 其他分享 >.NET Core 实现后台任务(定时任务)

.NET Core 实现后台任务(定时任务)

时间:2022-12-29 17:55:05浏览次数:43  
标签:Core Task StopAsync CancellationToken public StartAsync 后台任务 IHostedService NET

IHostedService和BackgroundService

前言

平时写代码的时候,大家多多少少都会遇到定时任务的要求,今天介绍两种定时任务的写法,严格来说其实是一种。

相对来说比较粗糙,请多多指教。

方法一 IHostedService

简介

######## IHostedService 接口

IHostedService 接口为主机托管的对象定义了两种方法:

  • StartAsync(CancellationToken)
  • StopAsync(CancellationToken)

######## StartAsync

StartAsync(CancellationToken) 包含用于启动后台任务的逻辑。

StartAsync应仅限于短期任务,因为托管服务是按顺序运行的,在StartAsync运行完成之前不会启动其他服务。

######## StopAsync

StopAsync(CancellationToken) 在主机执行正常关闭时触发。 StopAsync包含结束后台任务的逻辑。

StopAsync中调用的任何方法都应及时返回。

第一步 Program类添加相关配置
// .Net 6
builder.Services.AddHostedService<TestHostedService>();

// .Net  5 及以下
services.AddHostedService<TestHostedService>();
第二步 创建操作类(HostedHelpsService)
public class HostedHelpsService : IHostedService, IDisposable
{
    private Timer? _timer;

    public Task StartAsync(CancellationToken cancellationToken)
    {
        _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));

        return Task.CompletedTask;
    }

    private void DoWork(object? state)
    {
        Console.WriteLine($"{DateTime.Now:yyyy-MM-dd HH:mm:ss}");
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        Console.WriteLine("StopAsync");

        return Task.CompletedTask;
    }


    public void Dispose()
    {
        _timer?.Dispose();
    }
}

方法二 BackgroundService

简介

BackgroundService 是 IHostedService的一个简单实现,内部IHostedService 的StartAsync调用了ExecuteAsync”,本质上就是使用了 IHostedService,BackgroundService 是用于实现长时间运行的 IHostedService 的基类。

调用 ExecuteAsync()来运行后台服务。 实现返回一个 Task,其表示后台服务的整个生存期。

第一步 创建服务类
public interface IWorkService
{
    Task TaskWorkAsync(CancellationToken stoppingToken);
}
public class WorkService : ITaskWorkService
{
    public async Task WorkAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            //执行任务
            Console.WriteLine($"{DateTime.Now}");
			//要添加await,不然任务将不会等待执行结果,直接进行下一个任务。
            //周期性任务,于上次任务执行完成后,等待5秒,执行下一次任务
            await Task.Delay(500);
        }
    }
}
第二步 注册服务
builder.Services.AddScoped<IWorkService, WorkService>();
第三步 创建调用类
public class BackgroundTestService : BackgroundService
{
    private readonly IServiceProvider _services;

    public BackgroundTestService(IServiceProvider services)
    {
        _services = services;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        using var scope = _services.CreateScope();
		//获取服务类
        var taskWorkService = scope.ServiceProvider.GetRequiredService<IWorkService>();
  		//执行服务类的定时任务
        await taskWorkService.TaskWorkAsync(stoppingToken);
    }
}
第四步 添加主机服务
builder.Services.AddHostedService<BackgroundTestService>();

标签:Core,Task,StopAsync,CancellationToken,public,StartAsync,后台任务,IHostedService,NET
From: https://www.cnblogs.com/rsg-zxh/p/17013156.html

相关文章