首页 文章

Discord.NET等待外部命令

提问于
浏览
1

我正在编写Discord bot,我遇到了一个大问题 . 我正在编写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);
}

一切似乎都运作良好......直到它被执行 . 整个机器人卡住了,它无休止地等待,所以我想我已经错误地使用了异步和等待命令 . 如果我根本不使用它们,则消息将进入超时状态 .

2 回答

  • 1

    如果要按照正确的异步模式,请按以下方式修改代码:

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

    并按以下方式拨打电话:

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

    创建一个以异步方式运行函数而不等待该任务的任务只是没用,只需在没有等待的情况下调用异步函数并返回任务,它将阻止任务规划器在不同的上下文切换上拆分代码 .

  • 4

    client.ExecuteAndWait() 阻止调用上下文,直到父 DiscordClient (在您的情况下, client )断开连接 .

    这不是创建异步上下文的正确方法 - 最简单的方法是将代码包装在 Task.Run 中,如下所示:

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

相关问题