【发布时间】:2018-10-10 14:28:31
【问题描述】:
所以,我正在制作一个不和谐机器人,它能够在一定时间后改变角色的颜色。它运行正常,但是,在运行此任务时,机器人无法注册其他命令或运行任何其他工作。 (运行停止命令时它不会停止,因为它首先无法进入那里)。
我希望这里有人可以帮助解决这个问题。
下面是部分代码:
[Group("rainbow")]
public class Rainbow : ModuleBase<SocketCommandContext>
{
public Boolean enabled;
[Command, RequireUserPermission(GuildPermission.ManageRoles)]
public async Task rainbowAsync(SocketRole role, int milliseconds)
{
if (milliseconds >= 500) {
enabled = true;
while (enabled)
{
Random rnd = new Random();
double id = rnd.NextDouble() * 7;
if (id < 1)
{
await role.ModifyAsync(a => a.Color = Discord.Color.Red);
}
else if (id < 2)
{
await role.ModifyAsync(a => a.Color = Discord.Color.Orange);
}
else if (id < 3)
{
await role.ModifyAsync(a => a.Color = Discord.Color.LightOrange);
}
else if (id < 4)
{
await role.ModifyAsync(a => a.Color = Discord.Color.Green);
}
else if (id < 5)
{
await role.ModifyAsync(a => a.Color = Discord.Color.Blue);
}
else if (id < 6)
{
await role.ModifyAsync(a => a.Color = Discord.Color.DarkBlue);
}
else if (id < 7)
{
await role.ModifyAsync(a => a.Color = Discord.Color.Purple);
}
await Task.Delay(milliseconds);
}
}
else { await ReplyAsync("Time value must be higher than 500ms"); }
}
[Command("stop"), RequireUserPermission(GuildPermission.ManageRoles)]
public async Task StopAsync()
{
enabled = false;
await ReplyAsync("Rainbow effect stopped");
}
}
【问题讨论】:
-
您确实需要提供minimal reproducible example。看看How to Ask。
-
“运行停止命令时它不会停止,因为它一开始就无法进入”我们需要知道发生了什么阻止它到达那里.. . . 像,代码看起来像什么,无法到达 StopAsync()。
-
其余代码应该没问题,因为其他具有类似结构的命令运行良好
-
它不能做任何其他事情,因为你的任务卡在一个无限的while循环中。任务需要完成或停止才能处理另一个任务。我认为您的 StopAsync() 已排队,但因此无法执行。您可能可以通过使用检查“停止”是否在消息上下文中并在主类中将启用的布尔值设置为 false 的方法来解决此问题。
标签: c# discord.net