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

ASP.NET Core中BackgroundService无法运行的问题求助

ASP.NET Core BackgroundService 无法运行的解决方法

问题根源

你的Cardinal后台服务无法启动,核心问题有三个:

  1. 托管服务注册方式错误:用AddSingleton注册BackgroundService不会触发ASP.NET Core的托管服务生命周期管理,框架不会自动启动服务。
  2. 错误重写StartAsync方法:自定义的StartAsync覆盖了基类的启动逻辑,且直接抛出异常,导致服务启动流程中断。
  3. 手动获取服务实例无意义:托管服务由框架自动管理生命周期,手动获取实例不会触发服务启动。

修复步骤

1. 修正Program.cs中的服务注册

将单例注册改为托管服务专用的注册方式,同时删除手动获取实例的冗余代码:

// 替换原单例注册代码
builder.Services.AddHostedService<Cardinal>();

// 删除以下无用代码:
// var Cardinal = app.Services.GetRequiredService<Cardinal>();

2. 删除Cardinal类中自定义的StartAsync方法

基类BackgroundService已经实现了StartAsync来启动ExecuteAsync的后台逻辑,自定义的方法会破坏这个流程,直接删除:

// 删掉这段代码
internal async Task StartAsync()
{
    throw new NotImplementedException();
}

3. 额外建议:确保QueueModel的线程安全性

由于Cardinal是后台线程执行,QueueModel的队列操作(GetQueueCount、Dequeue)如果是静态实现,必须保证线程安全。建议改用ConcurrentQueue<T>或者加锁实现:

// 示例:用ConcurrentQueue重构QueueModel的线程安全实现
public static class QueueModel
{
    private static readonly ConcurrentQueue<QueueModel> _queue = new ConcurrentQueue<QueueModel>();

    public static int GetQueueCount() => _queue.Count;

    public static QueueModel Dequeue()
    {
        _queue.TryDequeue(out var player);
        return player;
    }

    public static void Enqueue(QueueModel player) => _queue.Enqueue(player);
}

验证修复

启动项目后,控制台会每隔10秒输出Queue Count: X的日志,同时SignalR客户端会收到对应的队列数量消息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 15:07:28