奕玖科技 > 新闻中心 > 技术文章

c# 后台任务 计划任务的实现方案

来源: 奕玖科技 瘦死的猪 | 2025/11/7 8:08:26

有的时候我们需要定时的让WEB系统来执行特定的任务,这个时候我们就需要使用c#的HostedService来执行后台任务。那么什么是HostedService呢?

20230111638090414141310678.jpg

HostedService 本质是一个实现了 IHostedService 接口的类,其核心作用是封装后台任务的 “启动” 和 “停止” 逻辑,由.NET 宿主(Host)统一管理生命周期。

  • 接口方法:

    1. StartAsync(CancellationToken):应用启动时调用,用于初始化并启动后台任务(如开启循环、连接消息队列)。

    2. StopAsync(CancellationToken):应用关闭时调用,用于优雅释放资源(如关闭连接、终止循环)。

  • 核心优势:

    • 生命周期与宿主绑定,无需手动管理线程或进程。

    • 支持依赖注入(DI),可便捷使用配置、日志等服务。

    • 自动处理应用关闭时的资源清理,避免强制终止导致的数据丢失。


下面是一个完整的示例代码

    public class HostedService : IHostedService, IDisposable
    {
        private Timer? _timer;
        private readonly AppDb app;
        private readonly IWebHostEnvironment env;
        public HostedService(IWebHostEnvironment _env) {
            app = new NewAppDb().app;
            env = _env;

        }
        public Task StartAsync(CancellationToken cancellationToken)
        {
            if (!env.IsDevelopment()) {
                int m = 10;
                _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromMinutes(m));

            }
            


            return Task.CompLetedTask;
        }
        private void DoWork(object? state)
        {
            try
            {
                SysConfig sysconfig = app.SysConfig.AsNoTracking().FirstOrDefault(b => b.Id == 1)!;
                DateTime today = DateTime.Now;
                if (today >= sysconfig.CheckTime) //推送文章
                {
                    Var d = app.HostedArticle.AsNoTracking().FirstOrDefault();

                    if (d != null)
                    {
                       
                        Article model = My.Parse<Article>(d)!;
                        model.Id = 0;
                        model.Times = DateTime.Now;
                        app.Article.Add(model);
                        app.SaveChanges();
      
                    }
                }
             
            }
            catch (Exception)
            {

            }
        }
        public Task StopAsync(CancellationToken cancellationToken)
        {
            return Task.CompletedTask;
        }
        public void Dispose()
        {
            _timer?.Dispose();
 
        }
    }

上面的代码从StartAsync开始执行,我这里设置的是每10分钟运行一次DoWork,DoWork里定义的是我要执行的操作。是不是很简单?

当然我们还可以使用BackgroundService来实现,BackgroundService跟HostedService有什么区别呢?

在.NET 中,BackgroundServiceIHostedService 并非对立关系,而是抽象与实现的关系,核心目的都是管理后台任务的生命周期,但定位和用法有明确区别。

核心区别:接口 vs 抽象基类

  • IHostedService:是接口,定义了后台任务的最小生命周期契约(仅包含 StartAsyncStopAsync 方法),所有后台服务都必须实现此接口才能被宿主(Host)管理。

  • BackgroundService:是抽象基类,它实现了 IHostedService 接口,并封装了 “长时间运行任务” 的通用逻辑(如循环执行、取消信号处理),简化了开发者的代码编写。

具体差异对比

维度IHostedService(接口)BackgroundService(抽象基类)
本质定义后台任务的生命周期规范(启动 / 停止)基于 IHostedService 的具体实现,提供通用模板
必须实现的方法StartAsyncStopAsync(两个方法)只需重写 ExecuteAsync(核心执行逻辑)
适用场景需完全自定义生命周期逻辑的任务(如短期任务)长时间运行的循环任务(如定时任务、消息监听)
复杂度需手动处理线程、循环、取消信号等细节内置循环和取消逻辑,开发者只需关注核心业务
资源释放需手动实现 IDisposable(若有资源需释放)已实现 IDisposable,可重写 Dispose 释放资源

用法示例对比

1. 直接实现 IHostedService

需手动处理任务的启动、循环、停止和资源释放,适合特殊场景:

public class MyHostedService : IHostedService, IDisposable
{
    private readonly ILogger _logger;
    private Timer? _timer;

    public MyHostedService(ILogger<MyHostedService> logger) => _logger = logger;

    // 启动任务
    public Task StartAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("任务启动");
        _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
        return Task.CompletedTask;
    }

    // 核心逻辑
    private void DoWork(object? state) => _logger.LogInformation("执行任务");

    // 停止任务
    public Task StopAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("任务停止");
        _timer?.Change(Timeout.Infinite, 0);
        return Task.CompletedTask;
    }

    // 释放资源
    public void Dispose() => _timer?.Dispose();
}

好了,上述就是c#的后台任务实现方法

栏目导航
相关文章
文章标签
关于我们
公司简介
企业文化
资质荣誉
服务项目
高端网站定制
微信小程序开发
SEO排名推广
新闻动态
行业新闻
技术学院
常见问题
联系我们
联系我们
人才招聘
联系方式
Q Q:24722
微信:24722
电话:13207941926
地址:江西省抚州市赣东大道融旺国际3栋
Copyright©2008-2022 抚州市奕玖科技有限公司 备案号:赣ICP备2022010182号-1