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

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, "处理完成");
}

关键说明

  1. 并行任务:订单处理的延迟任务和消息监听任务分开执行,互不阻塞,确保消息响应实时性。
  2. 循环监听:监听任务中循环检测用户消息,直到订单处理完成,每次检测后加入100ms延迟,避免过度占用资源。
  3. 任务同步:先等待订单处理完成,再等待监听任务结束,确保所有逻辑执行完毕后再进行后续操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:28:12