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

ASP.NET Core Web API多线程环境下服务与控制器数据传递问题

问题解答

1. 共享StateHandler实例的方案

核心是利用ASP.NET Core的依赖注入(DI)系统,把StateHandler注册为单例服务,确保整个应用中仅存在一个实例,后台服务与控制器通过DI获取该实例,即可共享状态。

具体操作:

  • 在Program.cs的服务注册环节添加单例声明:
    builder.Services.AddSingleton<StateHandler>();
    
  • 修改后台任务类(原ServiceProvider)的构造函数,通过DI注入StateHandler:
    public class PollingBackgroundService : BackgroundService
    {
        private readonly StateHandler _stateHandler;
    
        public PollingBackgroundService(StateHandler stateHandler)
        {
            _stateHandler = stateHandler;
        }
    
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                // 调用外部API获取JSON数据
                var externalData = await FetchExternalDataAsync();
                // 调用StateHandler的更新方法(已有锁保证线程安全)
                _stateHandler.UpdateState(externalData);
                // 等待指定毫秒数,使用带取消令牌的延迟避免阻塞退出
                await Task.Delay(TimeSpan.FromMilliseconds(x), stoppingToken);
            }
        }
    }
    
  • 修改ProviderController的构造函数,同样注入StateHandler:
    [ApiController]
    [Route("api/state")]
    public class ProviderController : ControllerBase
    {
        private readonly StateHandler _stateHandler;
    
        public ProviderController(StateHandler stateHandler)
        {
            _stateHandler = stateHandler;
        }
    
        [HttpGet]
        public IActionResult GetCurrentState()
        {
            return Ok(_stateHandler.GetState());
        }
    }
    

2. 后台任务的正确启动方式

直接在Program.cs中手动启动ServiceProvider并不合理,ASP.NET Core框架提供了BackgroundService/IHostedService原生后台服务机制,能更好地管理任务生命周期:

  • 自动随应用启动/关闭,支持优雅停止(通过取消令牌处理退出逻辑);
  • 内置异常捕获、线程管理能力,避免手动启动线程可能引发的资源泄漏或异常丢失问题。

正确步骤:

  1. 将原ServiceProvider改造为继承BackgroundService的类(示例代码见上面的PollingBackgroundService);
  2. 在Program.cs中注册该后台服务:
    builder.Services.AddHostedService<PollingBackgroundService>();
    

框架会自动负责后台任务的启动与生命周期管理,无需手动实例化启动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:40:58