You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core Web API中每隔X秒独立线程执行指定代码实现咨询

问题分析

你的代码无法正常运行的核心原因是Timer是Main方法中的局部变量,方法执行完成后没有根引用维持它的存活,会被垃圾回收器回收,最终Elapsed事件不会触发。另外这种直接在入口写Timer的方式不符合ASP.NET Core的应用生命周期管理规范,不推荐使用。

推荐实现方案

ASP.NET Core 官方提供了IHostedService接口和BackgroundService抽象类用于实现后台运行的独立线程任务,是这类场景的标准实现方案。

实现步骤

  • 第一步:自定义后台服务类,继承BackgroundService
  • 第二步:将自定义服务注册到依赖注入容器
  • 第三步:按需处理服务启动、停止的生命周期逻辑

完整示例代码

自定义后台服务

using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;

public class TimedHostedService : BackgroundService
{
    private readonly ILogger<TimedHostedService> _logger;
    private System.Timers.Timer _timer;

    public TimedHostedService(ILogger<TimedHostedService> logger)
    {
        _logger = logger;
    }

    protected override Task ExecuteAsync(CancellationToken stoppingToken)
    {
        _timer = new System.Timers.Timer(1000);
        _timer.Elapsed += DoWork;
        _timer.AutoReset = true;
        _timer.Start();
        
        // 应用停止时自动释放资源
        stoppingToken.Register(() => 
        {
            _timer?.Stop();
            _timer?.Dispose();
        });

        return Task.CompletedTask;
    }

    private void DoWork(object sender, ElapsedEventArgs e)
    {
        _logger.LogInformation("Look mom, I'm on a thread.");
    }

    public override Task StopAsync(CancellationToken stoppingToken)
    {
        _timer?.Stop();
        _timer?.Dispose();
        return base.StopAsync(stoppingToken);
    }
}

注册服务

如果是.NET 6+ 顶层语句的Program.cs,添加如下代码:

builder.Services.AddHostedService<TimedHostedService>();

如果是带Startup的旧版本框架,在Startup.cs的ConfigureServices方法中添加:

services.AddHostedService<TimedHostedService>();
注意事项
  • 后台服务和应用生命周期绑定,应用停止时会自动触发StopAsync方法,你可以在该方法中释放资源、处理未完成的任务,避免数据丢失。
  • 如果需要在后台服务中使用Scoped生命周期的服务(例如DbContext),不能直接通过构造函数注入,需要手动创建作用域获取,示例如下:
using (var scope = ServiceProvider.CreateScope())
{
    var dbContext = scope.ServiceProvider.GetRequiredService<MyDbContext>();
    // 执行业务逻辑
}
  • 执行异步任务时请做好异常捕获和日志记录,避免异常被静默吞噬导致问题难以排查。
  • 若需要支持Cron表达式定时、任务持久化、失败重试等复杂调度能力,可以使用Quartz.NET等第三方调度库,简单定时场景使用官方的BackgroundService即可满足需求。

内容的提问来源于stack exchange,提问作者Sebastian Ciocarlan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 18:30:00