一小时后,getRepdate()方法无法通过AggregateException

时间:2017-10-05 10:35:37

标签: c# telegram telegram-bot

我有一些使用" 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:发生了一个或多个错误。 ---&GT;   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__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.Task 1.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__125 1.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();
        }

2 个答案:

答案 0 :(得分:2)

通常getUpdates用于调试。要发布机器人,您需要使用电报WebhookSee this

  

getUpdates是一种拉机制,setWebhook是push。   使用Webhook而不是getUpdates有一些优点:

     
      
  1. 避免机器人经常要求更新。
  2.   
  3. 避免在代码中使用某种轮询机制。
  4.   

答案 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
           }
        }