2016-10-23 5 views
1

Ich programmiere Discord Bot und ich ging in ein großes Problem. Ich programmiere RPG-Bot, also muss ich HP und HP des Gegners wirklich oft schreiben, also habe ich eine Funktion gemacht.Discord.NET erwarten außerhalb Befehl

private void showHP(CommandEventArgs e) 
{ 
    client.ExecuteAndWait(async() => 
    { 
     await e.Channel.SendMessage(userInside + " - " + player.HP); 
    }); 
} 

Dieses CommandEventArgs e kommt von der Befehlsfunktion, da ich auf den Kanal zugreifen muss, in dem dieser Befehl ausgeführt wurde.

Alles scheint ziemlich gut zu funktionieren ... Bis es ausgeführt wird. Der ganze Bot steckt fest und es wartet endlos, also denke ich, dass ich Async benutzt habe und Befehle falsch abgehört habe. Wenn ich sie überhaupt nicht benutze, gerät die Nachricht in Timeout.

+0

Oder ist ein Problem bei der Verwendung von discord.ExecuteAndWait? –

Antwort

1

Wenn Sie das richtige Muster folgen wollen für async dann Ihren Code wie folgt ändern:

private Task showHP(CommandEventArgs e) 
{ 
    return e.Channel.SendMessage($"{userInside} - {player.HP}"); 

} 

Und das Gespräch wie folgt tun:

commands.CreateCommand("attack") 
      .Do(async (e) => 
      { 
       await e.Channel.SendMessage("You have attacked"); 
       await showHP(e); 
      } 

Erstellen einer Aufgabe zum Ausführen einer Funktion als async und warten Sie nicht auf diese Aufgabe ist einfach nutzlos, rufen Sie einfach die async-Funktion ohne warten und die Aufgabe zurück, es wird verhindert, dass der Aufgabenplaner den Code auf verschiedene Kontextschalter aufgeteilt.

+0

Das ist perfekt, danke! :3 –

4

client.ExecuteAndWait() blockiert den aufrufenden Kontext, bis das übergeordnete Element DiscordClient (in Ihrem Fall client) getrennt wird.

Dies ist nicht der richtige Weg, einen asynchronen Kontext zu schaffen - der einfachste Weg, dies zu tun, Ihren Code in einem Task.Run wickeln würde, etwa so:

private void showHP(CommandEventArgs e) 
{ 
    Task.Run(async() => { 
     await e.Channel.SendMessage($"{userInside} - {player.HP}"); 
    }); 
} 
+0

Noch besser, nur mit 'void showHP() {e.Channel.SendMessage ($" {userInside} - {player.HP} "); } ' – Gusman

+0

@Gusman gut, aber nicht speziell" besser "OP-Code ist' async' – Jim

+0

Funktion ist void, so wird es nicht bis zum Ende der Aufgabe warten, ruft eine asynchrone Aufgabe ohne Wartezeit hat das gleiche Ergebnis, es ist sogar mehr Effizient, da es keinen mehr zurück zum wartenden Code gibt, also ja, es ist besser. – Gusman