1

私は Discord ボットをプログラミングしていて、大きな問題に遭遇しました。私はRPGボットをプログラミングしているので、プレイヤーのHPと敵のHPを頻繁に書き込む必要があるため、関数を作成しました。

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

その CommandEventArgs e は、そのコマンドが実行されたチャネルにアクセスする必要があるため、 Command 関数から取得されます。

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

すべてがかなりうまくいくようです...実行されるまで。ボット全体がスタックし、際限なく待機しているため、非同期コマンドと待機コマンドを間違って使用したと思います。それらをまったく使用しないと、メッセージがタイムアウトになります。

4

2 に答える 2

4

client.ExecuteAndWait()DiscordClient親(あなたの場合はclient) が切断されるまで、呼び出しコンテキストをブロックします。

これは、非同期コンテキストを作成する適切な方法ではありません。最も簡単な方法はTask.Run、次のようにコードを でラップすることです。

private void showHP(CommandEventArgs e)
{
    Task.Run(async () => {
        await e.Channel.SendMessage($"{userInside} - {player.HP}");
    });
}
于 2016-10-23T19:25:47.050 に答える