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

在ASP.NET Core中如何让循环异步任务在独立进程运行?

实现方法

要让Telegram消息更新的异步方法持续在后台运行,同时不影响网站的数据库读写等其他业务操作,推荐以下几种方案,ASP.NET Core环境下优先使用后台服务托管方式:

方案一:使用BackgroundService(ASP.NET Core 官方推荐)

这种方式会将后台任务与应用生命周期绑定,自动处理启动、停止和异常情况,避免任务被意外回收,是最稳定的实现方式。

步骤1:创建后台服务类

public class TelegramUpdateService : BackgroundService
{
    private readonly TelegramBotClient _botClient;

    // 通过依赖注入注入单例的TelegramBotClient,避免重复创建实例
    public TelegramUpdateService(TelegramBotClient botClient)
    {
        _botClient = botClient;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        int? updateId = null;
        // 监听应用停止信号,收到信号时优雅退出循环
        while (!stoppingToken.IsCancellationRequested)
        {
            try
            {
                var updates = await _botClient.GetUpdatesAsync(updateId, cancellationToken: stoppingToken);
                foreach (var update in updates)
                {
                    // 执行你的业务逻辑
                    updateId = update.Id + 1;
                }
                // 添加短延迟,避免频繁调用API触发限流
                await Task.Delay(1000, stoppingToken);
            }
            catch (Exception ex)
            {
                // 记录异常日志,异常后延迟重试
                await Task.Delay(5000, stoppingToken);
            }
        }
    }
}

步骤2:注册服务到应用容器

在Program.cs中注册单例的TelegramBotClient和后台服务:

var builder = WebApplication.CreateBuilder(args);

// 注册TelegramBotClient为单例
string telegramToken = "你的Token";
builder.Services.AddSingleton(new TelegramBotClient(telegramToken));

// 注册后台服务,应用启动时自动运行
builder.Services.AddHostedService<TelegramUpdateService>();

var app = builder.Build();
// ... 其他中间件配置
app.Run();

应用启动后,后台服务会自动开始运行,网站的其他业务操作完全不受影响;当应用停止时,任务会收到停止信号并优雅退出。

方案二:使用Task.Run(非ASP.NET Core环境或简单场景)

如果是控制台应用或非托管场景,可以直接用Task.Run启动后台任务,但ASP.NET Core环境下不推荐这种方式——IIS或托管环境可能会回收无引用的后台任务,导致意外终止。

// 在应用启动的入口处调用
_ = Task.Run(async () =>
{
    string telegramToken = "你的Token";
    var botClient = new TelegramBotClient(telegramToken);
    int? updateId = null;
    while (true)
    {
        try
        {
            var updates = await botClient.GetUpdatesAsync(updateId);
            foreach (var update in updates)
            {
                // 执行你的业务逻辑
                updateId = update.Id + 1;
            }
            await Task.Delay(1000);
        }
        catch (Exception ex)
        {
            // 记录异常并延迟重试
            await Task.Delay(5000);
        }
    }
});

注意事项

  • 复用TelegramBotClient:不要在循环内重复创建实例,将其注册为单例复用,减少资源消耗和API调用限制风险。
  • 必须添加异常处理:捕获API调用或业务逻辑中的异常,配合延迟重试,防止任务因单次错误直接终止。
  • ASP.NET Core环境禁用裸Task.Run:直接启动的后台任务可能被应用池回收,BackgroundService是官方推荐的稳定方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:32:52