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

HostedService 本质是一个实现了 IHostedService 接口的类,其核心作用是封装后台任务的 “启动” 和 “停止” 逻辑,由.NET 宿主(Host)统一管理生命周期。
下面是一个完整的示例代码
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 中,BackgroundService 和 IHostedService 并非对立关系,而是抽象与实现的关系,核心目的都是管理后台任务的生命周期,但定位和用法有明确区别。
核心区别:接口 vs 抽象基类
具体差异对比
| 维度 | IHostedService(接口) | BackgroundService(抽象基类) |
|---|---|---|
| 本质 | 定义后台任务的生命周期规范(启动 / 停止) | 基于 IHostedService 的具体实现,提供通用模板 |
| 必须实现的方法 | StartAsync、StopAsync(两个方法) | 只需重写 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#的后台任务实现方法