Discord.NET 等待外部命令
Discord.NET await outside command
我正在编写 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);
}
一切似乎都运行良好......直到它被执行。整个机器人卡住了,它在无休止地等待,所以我想我错误地使用了异步和等待命令。如果我根本不使用它们,消息就会超时。
client.ExecuteAndWait()
阻塞调用上下文,直到父 DiscordClient
(在您的情况下,client
)断开连接。
这不是创建异步上下文的正确方法 - 最简单的方法是将您的代码包装在 Task.Run
中,如下所示:
private void showHP(CommandEventArgs e)
{
Task.Run(async () => {
await e.Channel.SendMessage($"{userInside} - {player.HP}");
});
}
如果您想遵循正确的异步模式,请按如下方式修改您的代码:
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);
}
创建一个任务到 运行 作为异步函数并且不等待该任务是没有用的,只需调用不等待的异步函数和 return 任务,它会阻止任务规划器在不同的上下文切换上拆分代码。
我正在编写 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);
}
一切似乎都运行良好......直到它被执行。整个机器人卡住了,它在无休止地等待,所以我想我错误地使用了异步和等待命令。如果我根本不使用它们,消息就会超时。
client.ExecuteAndWait()
阻塞调用上下文,直到父 DiscordClient
(在您的情况下,client
)断开连接。
这不是创建异步上下文的正确方法 - 最简单的方法是将您的代码包装在 Task.Run
中,如下所示:
private void showHP(CommandEventArgs e)
{
Task.Run(async () => {
await e.Channel.SendMessage($"{userInside} - {player.HP}");
});
}
如果您想遵循正确的异步模式,请按如下方式修改您的代码:
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);
}
创建一个任务到 运行 作为异步函数并且不等待该任务是没有用的,只需调用不等待的异步函数和 return 任务,它会阻止任务规划器在不同的上下文切换上拆分代码。