不和谐.NET等待外部命令
本文关键字:命令 外部 等待 NET 不和谐 | 更新日期: 2023-09-27 18:14:24
我正在编程Discord bot,我遇到了一个大问题。我正在编写RPG bot,所以我需要经常编写玩家的生命值和敌人的生命值,所以我编写了一个函数。
private void showHP(CommandEventArgs e)
{
client.ExecuteAndWait(async() =>
{
await e.Channel.SendMessage(userInside + " - " + player.HP);
});
}
commanddeventargs e来自Command函数,因为我需要访问执行该命令的通道。
commands.CreateCommand("attack").Do(async (e) =>
{
await e.Channel.SendMessage("You have attacked");
showHP(e);
}
一切似乎都很顺利…直到它被执行。整个bot卡住了,它是无休止的等待,所以我认为我错误地使用了异步和等待命令。如果我根本不使用它们,消息就会进入超时
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);
}
创建一个任务来运行一个async函数,而不等待这个任务是没有用的,只调用async函数而不等待并返回任务,这将防止任务规划器在不同的上下文切换上分割代码。