很抱歉问题标题,我不确定应该是什么。
我有这种方法:
DiscordUtils.QuestionAsync
public static async Task QuestionAsync(InteractiveService interactive, SocketCommandContext context, int question, EmbedBuilder embed, int timeout)
{
await interactive.SendMessageWithReactionCallbacksAsync(
context, new ReactionCallbackData(null, embed.Build(), false, false, TimeSpan.FromMinutes(timeout))
.WithCallback(new Emoji("✅"), (_context, _reaction) => QuestionUtils.SetResponse(question, true))
.WithCallback(new Emoji("❌"), (_context, _reaction) => QuestionUtils.SetResponse(question, false))
);
}
如下所示:
QuestionUtils.QuestionResponse
这就是public static bool QuestionResponse(int question)
{
while (questions[question] == Response.None)
Thread.Sleep(100);
return questions[question] == Response.Yes;
}
的样子:
QuestionUtils.QuestionResponse
基本上,QuestionUtils.QuestionResponse
完成一次(循环)后,我的回调将仅被调用。
但是,我希望在DiscordUtils.QuestionAsync
循环时调用它们,因此可以“绕过”正在等待的东西。
所以我不希望QuestionUtils.QuestionResponse
等待QuestionUtils.SetResponse
执行|--------+------------+------------|
| PKid | name | occupation |
|--------+------------+------------|
| 1 | John Smith | Accountant |
| 2 | John Smith | Engineer |
| 3 | Jack Black | Funnyman |
| 4 | Jack Black | Accountant |
| 5 | John Smith | Manager |
|--------+------------+------------|
回调。
我该怎么做?
答案 0 :(得分:1)
使用Thread.Sleep
时不要使用async/await
,因为它会阻塞调用线程。而是使用Task.Delay
:
public static async Task<bool> QuestionResponse(int question)
{
while (questions[question] == Response.None)
await Task.Delay(100);
return questions[question] == Response.Yes;
}
答案 1 :(得分:0)
使用TaskCompletionSource
来手动控制Task
的完成时间。例如查看官方文档。正确实施后,您最终会得到类似await QuestionResponse(1)
之类的东西,或者无论您的问题ID是什么。如果您想并行运行多个Task
,并在完成所有操作后继续运行,请使用Task.WhenAll
。