C# Telegram Bot:如何在Task.Delay执行时实时响应用户消息?
Telegram机器人订单处理期间实时回复用户消息解决方案
问题说明
使用YourEasyBot开发Telegram机器人,通过Task.Delay()模拟订单处理的等待流程。现有代码仅能在Task.Delay执行完毕后,才回复用户消息“请稍候,您的订单正在处理中”,需要修改为:在Task.Delay执行期间,实时检测用户发送的消息并立即回复该内容。
当前代码
async Task ProceedOrder() { Message msg = new(); msg = await Telegram.SendTextMessageAsync(chat, "请稍候,您的订单正在处理中\n\n耗时不会超过3分钟"); long time = new Random().NextInt64(10, 181); await Task.Delay(TimeSpan.FromSeconds(Convert.ToDouble(time))); if(await NewTextMessage(update) != null){ await Telegram.SendTextMessageAsync(chat, "请稍候,您的订单正在处理中"); } await Telegram.DeleteMessageAsync(chat, msg.MessageId); msg = await Telegram.SendTextMessageAsync(chat, "处理完成"); }
期望对话流程
- 机器人发送:请稍候,您的订单正在处理中。耗时不会超过3分钟
- 用户发送消息,机器人立即回复:请稍候,您的订单正在处理中
- 用户再次发送消息,机器人立即回复:请稍候,您的订单正在处理中
Task.Delay结束后,机器人发送:处理完成
解决方案
原代码的问题在于await Task.Delay会阻塞当前方法执行,直到延迟结束才会检查用户消息,无法实时响应。核心解决思路是将订单处理延迟任务与消息监听任务并行执行。
修改后的代码
async Task ProceedOrder() { // 发送初始提示消息 Message initialMsg = await Telegram.SendTextMessageAsync(chat, "请稍候,您的订单正在处理中\n\n耗时不会超过3分钟"); // 生成10-180秒的随机延迟时间 int delaySeconds = new Random().Next(10, 181); var orderProcessingTask = Task.Delay(TimeSpan.FromSeconds(delaySeconds)); // 启动独立的消息监听任务 var messageListeningTask = Task.Run(async () => { while (!orderProcessingTask.IsCompleted) { // 检测用户新消息(需确保NewTextMessage能获取最新用户输入) var newUserMsg = await NewTextMessage(update); if (newUserMsg != null) { await Telegram.SendTextMessageAsync(chat, "请稍候,您的订单正在处理中"); // 可选:更新上下文避免重复响应同一条消息 // update = 获取最新上下文的逻辑 } // 短间隔轮询,平衡响应速度与资源消耗 await Task.Delay(100); } }); // 等待订单处理完成 await orderProcessingTask; // 等待消息监听任务收尾 await messageListeningTask; // 清理初始提示并发送完成通知 await Telegram.DeleteMessageAsync(chat, initialMsg.MessageId); await Telegram.SendTextMessageAsync(chat, "处理完成"); }
关键说明
- 并行任务:订单处理的延迟任务和消息监听任务分开执行,互不阻塞,确保消息响应实时性。
- 循环监听:监听任务中循环检测用户消息,直到订单处理完成,每次检测后加入100ms延迟,避免过度占用资源。
- 任务同步:先等待订单处理完成,再等待监听任务结束,确保所有逻辑执行完毕后再进行后续操作。
内容的提问来源于stack exchange,提问作者swipper.
相关产品推荐
相关产品推荐

