2017-09-17 6 views
-1

DiscordボットをRasberry Piに配置しましたが、問題が発生しました。コマンドを使用しようとすると、初めて動作します。しかし、これを2回目に使用する代わりに、「MessageReceivedハンドラがゲートウェイタスクをブロックしています」というメッセージが表示されます。 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throwでサーバー逃した最後のハートビート ()で[0x0000c]:System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccessで0 (まもなくして、それはその後Async APIコールを2回使用した後、Piのボットがクラッシュする

のSystem.Exception氏は述べていますSystem.Runtime.CompilerServicesにある0 のSystem.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Taskタスク)の[0x0003e]の中の[0x0003e] TaskAwaiter.ValidateEnd(System.Threading.Tasks.Taskタスク):0 、System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1 + ConfiguredTaskAwait [TResult] .GetResult()[0x00000] in:0 Discord.ConnectionManagerで+ <> c__DisplayClass28_0 + < b__0> d.MoveNext()0x0014b]:0

及び切断、一部を再接続しようとしているが、毎回erroring。私はコマンドインタフェースを使用していませんが、私はasync/awaitを使用しています。それは私の通常のコンピュータ上で完璧に動作し、私のパイを壊すだけです。

using Discord; 
using Discord.WebSocket; 
using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace GlurrrBotDiscord 
{ 
    public class Program 
    { 
     DiscordSocketClient client; 

     static void Main(string[] args) => new Program().MainAsync().GetAwaiter().GetResult(); 

     public async Task MainAsync() 
     { 
      client = new DiscordSocketClient(); 

      try 
      { 
       using(StreamReader sr = new StreamReader("botcode.txt")) 
       { 
        string code = sr.ReadLine(); 
        await client.LoginAsync(TokenType.Bot, code); 
       } 
      } 
      catch(Exception e) 
      { 
       Console.WriteLine("Code not found"); 
       Console.WriteLine(e.Message); 
      } 

      await client.StartAsync(); 
      await client.SetGameAsync("praise"); 

      client.MessageReceived += handleMessage; 

      await Task.Delay(-1); 
     } 

     private async Task handleMessage(SocketMessage msg) 
     { 
      Console.WriteLine(msg.Author + " : " + msg.Content); 

      if(msg.Content.Contains("/leave")) 
      { 
       var embed = new EmbedBuilder() { 
        Title = msg.Author + " has left", 
        Description = msg.Author + " has left the Discord and would like everyone to know they did. They are very triggered.", 
        Color = Color.DarkRed, 
       }; 

       await msg.Channel.SendMessageAsync("", false, embed); 
      } 
     } 
    } 
} 

完全なコードはServer missed last heartbeat atは〜あなたが実行しているのいずれかのコマンドは、ゲートウェイを使用し、(それが接続タイムアウトを聞かせするのに十分な長占有し続けることを意味しA MessageReceived handler is blocking the gateway taskの結果であるhttps://github.com/Silthreent/Glurrr-Discord-Bot

+0

関連コードをここに**掲載してください。 [mcve] – MickyD

+0

2つの非同期呼び出しを使用するときはいつでもそうです。 'IF(msg.Content.Contains( "/休暇")) {VAR埋め込み=新しいEmbedBuilder(){ タイトル= msg.Author + "残している"、 説明= msg.Author +" 「Discord」を離れ、誰もが知って欲しいと思っています。 を待つmsg.Channel.SendMessageAsync( ""、false、embed); } '' ' おそらく最も簡単な場所です。 ~~新しいコメントをスタックする。ゴミのように見える~~ – Silthreent

+1

あなたはコメントにコードを入れないので、質問を編集してそこに最小限の完全な検証可能なサンプルを置く必要があります。あなたの質問を更新する前にMickyDがあなたに送ったリンクを読んでください。コメントに載せたコードは一例として受け入れられません。 –

答えて

0

DiscordNetを使用するのではなくDiscordSharpPlusに切り替えて問題を修正しましたが、

0

であります30秒)。

これを修正するには、基本的なボットの実装の一部であるa command handlerを実装する必要があります。これにより、非同期のコマンドを実行してスレッドのブロックを防ぐことができます。 bot sampleを見て、実装が実際に実行されていることを確認することもできます。

+0

どれくらい待っても、2番目のコマンドでブレークします。私はコマンドハンドラを使用している別のボットを使用しようとしましたが、実際にはそれはさらに困難になります。それは最初のコマンドの後で中断し、そのコマンドを実行してから、2番目のコマンドを必要とせずにMessageRecievedハンドラの問題を出します。 – Silthreent

+0

@silthreentとuはハンドラのモードが非同期に設定されているユーザーです。関数は非同期モード属性で装飾されていましたか? –

+0

runmodeをasyncに設定しても、MessageRecievedハンドラメッセージは表示されませんが、最初のメッセージ以外のメッセージは一度も送信されません。 – Silthreent

関連する問題