2017-10-05 2 views
0

J'ai quelques applications de C# de télégramme qui utilisent le nobget "bot.telegram" qui ont le même problème. Je reçois le message et les commandes de l'utilisateur par la méthode getUpdate(). il est un simple exemple ci-dessous:La méthode getUpdate() ne fonctionne pas après quelques heures par AggregateException

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()); 
    } 
} 

et au bout de quelques heures (2-24 heures), il arrête et ne reçoit pas les messages de user.In « attraper exception » Je reçois cette erreur:

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()<---

que dois-je faire pour que "l'obtention de messages et la commande de l'utilisateur" fonctionnent sans arrêt?


Je résolu ce problème en mettant ce code après « essayer »:

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

Répondre

1

mises à jour peuvent expirer et vous aurez besoin de gérer cela - je suppose que l'application se bloque?

Attrape l'exception et gère le résultat (très probablement en l'ignorant). Vous devrez peut-être attendre le résultat.

 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

merci mais comment puis-je gérer cette exception et redémarrer la réception des mises à jour instantanément dans cette "catch exception"? – Lionking89

+0

Il faut juste ignorer cette exception et recommencer (retourner en haut de la boucle while (vrai).) Je suppose que votre application est en train de frapper le timeout, puis de s'écraser, donc de quitter la boucle. devrait permettre de réessayer - mais les exceptions asynchrones peuvent toujours provoquer une surprise ou deux. – dannymc18

2

Généralement getUpdates utilisé pour le débogage. Pour publier votre bot, vous devez utiliser le Télégramme 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.