我有一些使用" bot.telegram"的电报机器人C#应用程序。有相同问题的金块。
我通过getUpdate()方法获取用户消息和命令。下面有一个简单的例子:
private void Form1_Load(object sender, EventArgs e)
{
try
{
a = new Thread(new ThreadStart(GetUpdates));
a.Start();
}
catch (Exception ex)
{
bot.SendTextMessageAsync({myId}, ex.ToString());
}
}
public void GetUpdates()
{
try
{
offset = 0;
while (true)
{
updates = bot.GetUpdatesAsync(offset, 100, 360000).Result;
foreach (var update in updates)
{
offset = update.Id + 1;
if (update.Message == null || update.Message.Text == null)
continue;
switch (update.Message.Text)
{
case "/start":
job1();
break;
case "Msg2":
job2();
break;
case "Msg3":
job3();
break;
default:
job(4)
break;
}
}
}
}
catch (Exception ex)
{
bot.SendTextMessageAsync({myId}, ex.ToString());
}
}
并且在几个小时(2-24小时)之后它停止并且不从用户获得消息。在"捕获异常"我收到这个错误:
System.AggregateException:发生了一个或多个错误。 ---> Telegram.Bot.Exceptions.ApiRequestException:请求超时---> System.Threading.Tasks.TaskCanceledException:任务已取消。 在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务) 在System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(任务任务) 在Telegram.Bot.TelegramBotClient.d__125
1.MoveNext() --- End of inner exception stack trace --- at Telegram.Bot.TelegramBotClient.<SendWebRequestAsync>d__125
1.MoveNext() ---内部异常堆栈跟踪结束--- 在System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) 在System.Threading.Tasks.Task1.GetResultCore(Boolean waitCompletionNotification) at System.Threading.Tasks.Task
1.get_Result() at mahramanehBot.Main.GetUpdates()在C:\ Users \ Soroush \ documents \ visual studio中 2015 \ Projects \ mahramanehBot \ mahramanehBot \ Main.cs:第45行 ---&GT; (内部异常#0)Telegram.Bot.Exceptions.ApiRequestException:请求超时---&gt; System.Threading.Tasks.TaskCanceledException:任务已取消。 在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务) 在System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(任务任务) 在Telegram.Bot.TelegramBotClient.d__1251.MoveNext() --- End of inner exception stack trace --- at Telegram.Bot.TelegramBotClient.<SendWebRequestAsync>d__125
1.MoveNext()&lt; ---
我应该怎么做才能让用户获得消息和命令#34;工作没有停止?
我通过将此代码放在&#34;尝试&#34;:
后解决了这个问题 catch (AggregateException e)
{
Thread a = new Thread(GetUpdates);
a.Start();
}
答案 0 :(得分:2)
通常getUpdates
用于调试。要发布机器人,您需要使用电报Webhook
。 See this
getUpdates是一种拉机制,setWebhook是push。 使用Webhook而不是getUpdates有一些优点:
- 避免机器人经常要求更新。
- 避免在代码中使用某种轮询机制。
醇>
答案 1 :(得分:1)
更新可能会超时,您需要处理此问题 - 我认为应用程序崩溃了吗?
捕获异常并处理结果(最有可能忽略它)。您也可能需要等待结果。
while (true)
{
try
{
updates = await bot.GetUpdatesAsync(offset, 100, 360000);
foreach (var update in updates)
{
offset = update.Id + 1;
if (update.Message == null || update.Message.Text == null)
continue;
switch (update.Message.Text)
{
case "/start":
job1();
break;
case "Msg2":
job2();
break;
case "Msg3":
job3();
break;
default:
job(4)
break;
}
}
}
catch (ApiRequestException ex)
{
//handle or ignore
}
}