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

C#开发Telegram Bot:如何在模拟订单等待时接收处理消息

问题描述

我正在用C#开发一个用于模拟加密货币购买的Telegram机器人,仅作练习使用。当用户通过/buy指令完成所有下单信息填写后,机器人需要回复用户:请稍候,您的订单正在处理中。

实际场景这里会执行真实订单处理,但练习场景里需要让机器人模拟10-60秒的等待,同时在此期间如果用户发送任何消息,机器人要回复:您的订单正在处理中,不会花费太久。

现在的问题是,我用下面的代码实现等待时,机器人会被阻塞,无法处理用户的消息:

long time = new Random().NextInt64(10, 181);
Thread.Sleep(TimeSpan.FromSeconds(Convert.ToDouble(time)));

期望的交互流程:

机器人:请稍候,您的订单正在处理中
用户:(发送任意文本)
机器人:您的订单正在处理中,不会花费太久

请问如何实现既模拟订单等待,又能正常接收并处理用户消息?


解决方案

核心思路是避免阻塞主线程,改用异步等待+维护用户订单状态的方式实现:

  1. 用Task.Delay替代Thread.Sleep
    Thread.Sleep会直接阻塞当前线程,导致机器人无法响应新的消息请求;而Task.Delay是异步等待,不会占用线程,机器人主线程可以继续处理其他用户的消息。

  2. 维护用户的订单处理状态
    需要一个线程安全的容器(比如ConcurrentDictionary)记录当前正在处理订单的用户ID,这样当用户在等待期间发消息时,机器人可以快速判断状态并回复对应提示。

以下是具体实现代码示例(以常用的Telegram.Bot库为例):

// 线程安全的字典,存储正在处理订单的用户ID
private static readonly ConcurrentDictionary<long, bool> _processingUsers = new ConcurrentDictionary<long, bool>();

// 处理/buy指令的异步方法
public async Task HandleBuyCommand(Update update, CancellationToken cancellationToken)
{
    long userId = update.Message.From.Id;
    
    // 标记用户进入订单处理状态
    _processingUsers.TryAdd(userId, true);
    
    // 发送初始提示
    await _botClient.SendTextMessageAsync(
        chatId: update.Message.Chat.Id,
        text: "请稍候,您的订单正在处理中",
        cancellationToken: cancellationToken);
    
    // 生成10-60秒的随机等待时间
    var random = new Random();
    int waitSeconds = random.Next(10, 61);
    
    // 异步等待,不阻塞线程
    await Task.Delay(TimeSpan.FromSeconds(waitSeconds), cancellationToken);
    
    // 处理完成后移除用户的状态标记
    _processingUsers.TryRemove(userId, out _);
    
    // 可选:发送处理完成提示
    await _botClient.SendTextMessageAsync(
        chatId: update.Message.Chat.Id,
        text: "订单处理完成",
        cancellationToken: cancellationToken);
}

// 处理所有用户消息的通用方法
public async Task HandleAllMessages(Update update, CancellationToken cancellationToken)
{
    long userId = update.Message.From.Id;
    
    // 检查用户是否处于订单处理状态
    if (_processingUsers.ContainsKey(userId))
    {
        await _botClient.SendTextMessageAsync(
            chatId: update.Message.Chat.Id,
            text: "您的订单正在处理中,不会花费太久",
            cancellationToken: cancellationToken);
        return;
    }
    
    // 其他消息的处理逻辑...
}
  1. 关键注意事项
  • 必须使用ConcurrentDictionary而非普通Dictionary,因为Telegram机器人的消息处理是并发执行的,普通字典会有线程安全问题。
  • 如果使用其他Telegram Bot开发框架,核心逻辑完全通用:异步等待+状态标记。
  • 练习场景下只需标记用户是否在处理订单即可,若需扩展功能(如显示剩余时间),可以在状态容器中存储等待结束的时间戳。

内容的提问来源于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:10:16