2017-10-05 6 views
0

동일한 문제가있는 "bot.telegram"너겟을 사용하는 일부 텔레 그램 봇 C# 응용 프로그램이 있습니다.AggregateException에 의해 한 시간 후에 getUpdate() 메서드가 작동하지 않습니다.

getUpdate() 메소드를 통해 사용자 메시지와 명령을받습니다. 아래의 간단한 예제가있다 :

System.AggregateException: One or more errors occurred. ---> Telegram.Bot.Exceptions.ApiRequestException: Request timed out ---> System.Threading.Tasks.TaskCanceledException: A task was canceled. at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) at Telegram.Bot.TelegramBotClient.d__125 1.MoveNext() --- End of inner exception stack trace --- at Telegram.Bot.TelegramBotClient.<SendWebRequestAsync>d__125 1.MoveNext() --- End of inner exception stack trace --- at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) at System.Threading.Tasks.Task 1.GetResultCore(Boolean waitCompletionNotification) at System.Threading.Tasks.Task 1.get_Result() at mahramanehBot.Main.GetUpdates() in C:\Users\Soroush\documents\visual studio 2015\Projects\mahramanehBot\mahramanehBot\Main.cs:line 45 ---> (Inner Exception #0) Telegram.Bot.Exceptions.ApiRequestException: Request timed out ---> System.Threading.Tasks.TaskCanceledException: A task was canceled. at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) at Telegram.Bot.TelegramBotClient.d__125 1.MoveNext() --- End of inner exception stack trace --- at Telegram.Bot.TelegramBotClient.<SendWebRequestAsync>d__125 1.MoveNext()<---

:
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시간)은 중지하고 user.In "캐치 예외"메시지를 얻을하지 않습니다 나는이 오류가

"메시지를 받고 명령을받는"것을 멈추지 않고 어떻게해야합니까?


내가 "노력"다음에이 코드를 넣어이 문제를 해결 :

  catch (AggregateException e) 
     { 
      Thread a = new Thread(GetUpdates); 
      a.Start(); 
     } 

답변

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 
      } 
     } 
+0

감사합니다.이 예외를 처리하고 즉시이 "캐스 예외"에서 업데이트를 즉시 다시받을 수 있습니까? – Lionking89

+0

그냥 하나의 예외를 무시하고 다시 시도하십시오 (while (true) 루프의 맨 위로 돌아 가야합니다.) 현재 응용 프로그램이 제한 시간을 초과하면 충돌이 발생하여 루프를 종료합니다. 그냥 다시 시도 할 수 있도록해야합니다. 그러나 비동기 예외는 항상 놀람 또는 두 가지를 던질 수 있습니다. – dannymc18

2

일반적으로 getUpdates은 디버깅에 사용됩니다. 봇을 퍼블리시하려면 텔레 그램 Webhook을 사용해야합니다. See this.

getUpdates is a pull mechanism, setWebhook is push. There are some advantages of using a Webhook over getUpdates:

  1. Avoids your bot having to ask for updates frequently.
  2. Avoids the need for some kind of polling mechanism in your code.