Discord.NET等待外部命令

时间:2016-10-23 19:05:49

标签: c# asynchronous discord

我正在编写Discord bot并且我遇到了一个大问题。我正在编写RPG机器人,所以我需要经常编写玩家的HP和敌人的HP,所以我已经完成了一项功能。

cond

CommandEventArgs e来自Command函数,因为我需要访问执行该命令的通道。

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

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

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分: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);
            }

创建一个任务以将函数作为异步运行并且不等待该任务是没用的,只需在没有等待的情况下调用异步函数并返回任务,它将阻止任务规划器在不同的上下文中拆分代码开关。