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

ASP.NET Core Web API订阅代码应置于何处以避免阻塞执行?

问题分析与解决方案

你的代码卡在Main方法里导致程序挂起,核心原因是await foreach会无限阻塞主线程——这个循环会一直监听配置变更,导致后续的Web应用构建、启动代码完全没机会执行,自然整个程序就停在这里了。

这类长期运行的订阅任务,必须放在**后台服务(BackgroundService)**中托管,不能直接放在Main方法里。

具体实现步骤

1. 创建后台服务类

新建一个继承自BackgroundService的类,把订阅逻辑移到这里:

public class ConfigSubscriptionService : BackgroundService
{
    private readonly DaprClient _daprClient;

    // 通过依赖注入获取Dapr客户端
    public ConfigSubscriptionService(DaprClient daprClient)
    {
        _daprClient = daprClient;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        try
        {
            // 传入停止令牌,实现优雅退出
            var subscribe = await _daprClient.SubscribeConfiguration(
                "redisconfigstore", 
                new List<string> { "myKey" },
                cancellationToken: stoppingToken);

            // 监听配置变更,同时响应停止信号
            await foreach (var items in subscribe.Source.WithCancellation(stoppingToken))
            {
                var cfg = System.Text.Json.JsonSerializer.Serialize(items);
                Console.WriteLine("Configuration update " + cfg);
            }
        }
        catch (OperationCanceledException)
        {
            // 服务停止时的正常退出逻辑
            Console.WriteLine("Configuration subscription stopped.");
        }
    }
}

2. 在Program.cs中注册服务并完成应用启动

修改Main方法,确保正常完成Web API的构建和启动流程,同时注册后台服务:

static async Task Main(string[] args)
{
    var builder = WebApplication.CreateBuilder(args);

    // 注册Dapr客户端(推荐用依赖注入,而非手动创建)
    builder.Services.AddDaprClient();
    // 注册配置订阅的后台服务
    builder.Services.AddHostedService<ConfigSubscriptionService>();

    // 注册Web API必要的服务
    builder.Services.AddControllers();

    var app = builder.Build();

    // 配置Web API的中间件管道
    app.UseRouting();
    app.UseAuthorization();
    app.MapControllers();

    // 启动Web应用
    await app.RunAsync();
}

关键说明

  • BackgroundService是ASP.NET Core官方提供的长期任务托管方案,会在应用启动后后台独立运行,不会阻塞主线程。
  • 通过CancellationToken响应应用停止信号,确保订阅任务能优雅终止,避免资源泄漏。
  • 用AddDaprClient()注册客户端,而非手动创建,能更好地利用依赖注入管理对象生命周期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 12:45:10