【问题标题】:Discord.NET await outside commandDiscord.NET 等待外部命令
【发布时间】:2017-03-05 12:59:52
【问题描述】:

我正在编写 Discord 机器人,但遇到了一个大问题。我正在编写 RPG 机器人,所以我需要经常写玩家的生命值和敌人的生命值,所以我做了一个函数。

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);
}

一切似乎都很好......直到它被执行。整个机器人卡住并且无休止地等待,所以我认为我错误地使用了异步和等待命令。如果我根本不使用它们,消息就会超时。

【问题讨论】:

  • 还是discord.ExecuteAndWait的使用有问题?

标签: c# asynchronous discord


【解决方案1】:

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

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

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

【讨论】:

  • 更好,只需void showHP(){ e.Channel.SendMessage($"{userInside} - {player.HP}"); }
  • @Gusman 不错,但不是特别“更好” OP 的代码是 async
  • 函数是无效的,所以它不会等到任务结束,在没有等待的情况下调用异步任务的结果是一样的,因为没有更多的切换回等待的代码,效率更高,所以是的,这样更好。
【解决方案2】:

如果你想遵循正确的异步模式,那么修改你的代码如下:

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);
            }

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

【讨论】:

    猜你喜欢
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 2020-11-23
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多