在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
相关产品推荐
相关产品推荐

