我正在创建一条消息InlineKeyboardButton.WithCallbackData。接下来需要处理按钮的点击和处理。现在,代码只是打印选定的结果。问题本身是,当您单击此按钮时,机器人会冻结并且不会响应任何内容,直到您重新启动它为止。
处理本身也不会发生。任何地方都没有输出任何内容,只是简单地跳过了 的部分case UpdateType.CallbackQuery:。它不会给出任何错误,只是对该用户冻结。
private void startBtn_Click(object sender, EventArgs e)
{
cts = new CancellationTokenSource();
botClient.StartReceiving(Update, Error, cancellationToken: cts.Token);
}
private async Task Update(ITelegramBotClient client, Update update, CancellationToken c_token)
{
var message = update.Message;
logsListBox.Items.Add($"{message.Date}, {message.Chat.Id}: {message.Text}");
switch (update.Type)
{
case UpdateType.Message:
if (message.Text == "/start")
{
_ = await botClient.SendTextMessageAsync(
chatId: message.Chat.Id,
text: "Trying *all the parameters* of `sendMessage` method",
parseMode: ParseMode.MarkdownV2,
disableNotification: false,
replyToMessageId: message.MessageId,
replyMarkup: new InlineKeyboardMarkup(new[]
{
InlineKeyboardButton.WithCallbackData("EN", "en"),
InlineKeyboardButton.WithCallbackData("DE", "de"),
}),
cancellationToken: c_token);
};
break;
case UpdateType.CallbackQuery:
var pressedButtonID = update.CallbackQuery.Data;
logsListBox.Items.Add($"{pressedButtonID}");
_ = await botClient.SendTextMessageAsync(
chatId: message.Chat.Id,
text: pressedButtonID,
parseMode: ParseMode.MarkdownV2,
cancellationToken: c_token);
break;
default:
break;
}
}

您需要在 UI 线程中使用 UI 元素。
比如像这样。
更好的是,创建一个方法
现在您可以在不考虑线程的情况下进行编写
Log($"{pressedButtonID}");有一种跨平台方法可以使用
Progress<T>. 前一种方法仅适用于 WinForms。只需创建一个字段
在表单设计器中,添加在
InitializeComponent();该构造函数将在实例化时获取同步上下文。
现在你可以这样写:
log.Report($"{pressedButtonID}");任何流中的一切都是一样的。请记住将所选方法应用于来自第三方线程的所有调用,而不仅仅是在一个地方;列表框根本无法从第三方线程使用。正是由于这个原因,您可能会遇到不同步和死锁(冻结)。
也有可能您没有处理
Error. 显示处理程序,如果有问题我会添加答案。最后一件事。我不确定该机器人是否设计为在单线程同步上下文中工作。我建议在线程池上显式启动机器人,这将保证不会因 UI 同步上下文而出现奇怪的情况。