C#异步/等待问题

时间:2019-08-30 09:51:16

标签: c# async-await

很抱歉问题标题,我不确定应该是什么。

我有这种方法:

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 | |--------+------------+------------| 回调。

我该怎么做?

2 个答案:

答案 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