带有线程的Telegram机器人程序抛出异常



我有两个项目和一段代码。在其中一个中,一切都很好,但在另一个中我遇到了这个错误。我该如何解决这个问题?

private void btnStart_Click(object sender, EventArgs e)
{
botThread = new Thread(new ThreadStart(RunBot));
botThread.Start();
}
private void RunBot()
{
bot = new Telegram.Bot.TelegramBotClient(Token);
this.Invoke(new Action(() =>
{
lblStatus.Text = "online";
lblStatus.ForeColor = Color.Green;
btnStart.BackColor = Color.Red;
btnStart.Text = "stop";
}));

int offset = 0;
botIsRun = true;
while (botIsRun)
{
Telegram.Bot.Types.Update[] updates;
try
{
updates =bot.GetUpdatesAsync(offset).Result;
}
catch (Exception ex)
{
MessageBox.Show("Erorr", "Error");
botIsRun = false;
this.Invoke(new Action(() =>
{
lblStatus.Text = "Offline";
lblStatus.ForeColor = Color.Red;
btnStart.BackColor = Color.LightGreen;
btnStart.Text = "stop";
}));
continue;
}

foreach (var update in updates)
{
offset = update.Id + 1;
if (update.Message == null)
{
continue;
}
string text = update.Message.Text.ToLower();
var from = update.Message.From;
var chatId = update.Message.Chat.Id;
var a = update.Message.NewChatMembers;

if (text.Contains("/start"))
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("welcome " + from.Username)
.AppendLine("fromId: " + from.Id)
.AppendLine("From IsBot: " + from.IsBot)
.AppendLine("From LanguageCode: " + from.LanguageCode)
.AppendLine("From LastName: " + from.LastName)
.AppendLine("From SupportsInlineQueries: " + from.SupportsInlineQueries)
.AppendLine("From FirstName: " + from.FirstName)
.AppendLine("From CanJoinGroups: " + from.CanJoinGroups)
.AppendLine("From CanReadAllGroupMessages: " + from.CanReadAllGroupMessages);
bot.SendTextMessageAsync(chatId, sb.ToString());
}
}
}
}

System.Threading.Tasks.ThrowIfExceptional(布尔值包括TaskCanceledExceptions(位于System.Threading.Tasks.Task1.GetResultCore(Boolean waitCompletionNotification) at System.Threading.Tasks.Task1.get_Result((在C:\Users\MSP\Desktop\Telegram bot\project\TelegramBot\TelegramPot\FrmMain.cs:line 59 中的TelegramBot.FrmMain.RunBot((

问题是,您将Sync与Async代码混合在一起,您应该将private void RunBot()转换为private async Task RunBotAsync(),否则您将丢失updates =bot.GetUpdatesAsync(offset).Result;中的异常(此外,我还为您留下了一些关于应该考虑的内容的评论(:

private void btnStart_Click(object sender, EventArgs e)
{
//Convert your old [Thread botThread] variable to [Task botTask]
botTask = RunBotAsync;    //Don't worry, as RunBot() is now async, it will not block your ui
}
private async Task RunBotAsync()
{
bot = new Telegram.Bot.TelegramBotClient(Token);
this.Invoke(new Action(() =>
{
lblStatus.Text = "online";          //YOu shoul check this part, because accesing Form components here could be risky (becouse the method could be executed in other theread different to the UI thread, then you can get an error)
lblStatus.ForeColor = Color.Green;
btnStart.BackColor = Color.Red;
btnStart.Text = "stop";
}));

int offset = 0;
botIsRun = true;
while (botIsRun)
{
Telegram.Bot.Types.Update[] updates;
try
{
updates = await bot.GetUpdatesAsync(offset);
}
catch (Exception ex)
{
MessageBox.Show("Erorr", "Error");
botIsRun = false;
this.Invoke(new Action(() =>
{
lblStatus.Text = "Offline";
lblStatus.ForeColor = Color.Red;
btnStart.BackColor = Color.LightGreen;
btnStart.Text = "stop";
}));
continue;
}

foreach (var update in updates)
{
offset = update.Id + 1;
if (update.Message == null)
{
continue;
}
string text = update.Message.Text.ToLower();
var from = update.Message.From;
var chatId = update.Message.Chat.Id;
var a = update.Message.NewChatMembers;

if (text.Contains("/start"))
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("welcome " + from.Username)
.AppendLine("fromId: " + from.Id)
.AppendLine("From IsBot: " + from.IsBot)
.AppendLine("From LanguageCode: " + from.LanguageCode)
.AppendLine("From LastName: " + from.LastName)
.AppendLine("From SupportsInlineQueries: " + from.SupportsInlineQueries)
.AppendLine("From FirstName: " + from.FirstName)
.AppendLine("From CanJoinGroups: " + from.CanJoinGroups)
.AppendLine("From CanReadAllGroupMessages: " + from.CanReadAllGroupMessages);
await bot.SendTextMessageAsync(chatId, sb.ToString());
}
}
}
}

最新更新