gpt4 book ai didi

c# - 在 Task.WhenAll 中完成任务时是否有回调

转载 作者:太空狗 更新时间:2023-10-29 21:01:09 25 4
gpt4 key购买 nike

假设我有以下内容:

IEnumerable<Task<TimeSpan>> tasks = //...
TimeSpan[] results = await Task.WhenAll(tasks);
// Handle results

当我可以处理结果时,所有任务都必须完成。

有没有办法按需处理每个结果?

就像注册一个将在任务完成时执行的委托(delegate)/回调:

IEnumerable<Task<TimeSpan>> tasks = //...
await Task.WhenAll(tasks, result =>
{
// A task has finished. This will get executed.
// result is of type TimeSpan
});

最佳答案

Is there a way to handle each result on demand?

Like registering a delegate / callback that will get executed when a task is completed

是的,你只是需要稍微调整一下你的想法。

忘记注册回调(ContinueWith is a dangerous, extremely low-level API)。此外,您几乎不必按完成顺序对任务进行排序。相反,从操作(任务)的角度考虑您的问题。

现在,您有一组返回 TimeSpan 的任务。该集合中的每一项都是返回 TimeSpan 的单个操作。您真正想要做的是引入等待原始操作完成然后执行您的后操作逻辑的单个更高级别操作的概念。

这正是 async/await 的用途:

private static async Task<TimeSpan> HandleResultAsync(Task<TimeSpan> operation)
{
var result = await operation;
// A task has finished. This will get executed.
// result is of type TimeSpan
...
return result; // (assuming you want to propagate the result)
}

现在,您想将这个更高级别的操作应用到您现有的操作中。 LINQ 的 Select 非常适合此操作:

IEnumerable<Task<TimeSpan>> tasks = ...
IEnumerable<Task<TimeSpan>> higherLevelTasks = tasks.Select(HandleResultAsync);

TimeSpan[] results = await Task.WhenAll(higherLevelTasks);
// By the time you get here, all results have been handled individually.

如果你不需要最终的结果集合,这可以进一步简化:

private static async Task HandleResultAsync(Task<TimeSpan> operation)
{
var result = await operation;
// A task has finished. This will get executed.
// result is of type TimeSpan
...
}

IEnumerable<Task<TimeSpan>> tasks = ...
IEnumerable<Task> higherLevelTasks = tasks.Select(HandleResultAsync);
await Task.WhenAll(higherLevelTasks);

关于c# - 在 Task.WhenAll 中完成任务时是否有回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39624386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com