C#开发Telegram Bot:如何在模拟订单等待时接收处理消息
问题描述
我正在用C#开发一个用于模拟加密货币购买的Telegram机器人,仅作练习使用。当用户通过/buy指令完成所有下单信息填写后,机器人需要回复用户:请稍候,您的订单正在处理中。
实际场景这里会执行真实订单处理,但练习场景里需要让机器人模拟10-60秒的等待,同时在此期间如果用户发送任何消息,机器人要回复:您的订单正在处理中,不会花费太久。
现在的问题是,我用下面的代码实现等待时,机器人会被阻塞,无法处理用户的消息:
long time = new Random().NextInt64(10, 181); Thread.Sleep(TimeSpan.FromSeconds(Convert.ToDouble(time)));
期望的交互流程:
机器人:请稍候,您的订单正在处理中
用户:(发送任意文本)
机器人:您的订单正在处理中,不会花费太久
请问如何实现既模拟订单等待,又能正常接收并处理用户消息?
解决方案
核心思路是避免阻塞主线程,改用异步等待+维护用户订单状态的方式实现:
用
Task.Delay替代Thread.SleepThread.Sleep会直接阻塞当前线程,导致机器人无法响应新的消息请求;而Task.Delay是异步等待,不会占用线程,机器人主线程可以继续处理其他用户的消息。维护用户的订单处理状态
需要一个线程安全的容器(比如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; } // 其他消息的处理逻辑... }
- 关键注意事项
- 必须使用
ConcurrentDictionary而非普通Dictionary,因为Telegram机器人的消息处理是并发执行的,普通字典会有线程安全问题。 - 如果使用其他Telegram Bot开发框架,核心逻辑完全通用:异步等待+状态标记。
- 练习场景下只需标记用户是否在处理订单即可,若需扩展功能(如显示剩余时间),可以在状态容器中存储等待结束的时间戳。
内容的提问来源于stack exchange,提问作者swipper.
相关产品推荐
相关产品推荐

