【发布时间】:2022-02-02 01:08:50
【问题描述】:
我有一堆请求要处理,其中一些可能会同步完成。 我想收集所有立即可用的结果并尽早返回,同时等待其余结果。
大概是这样的:
List<Task<Result>> tasks = new ();
List<Result> results = new ();
foreach (var request in myRequests) {
var task = request.ProcessAsync();
if (task.IsCompleted)
results.Add(task.Result); // or Add(await task) ?
else
tasks.Add(task);
}
// send results that are available "immediately" while waiting for the rest
if (results.Count > 0) SendResults(results);
results = await Task.WhenAll(tasks);
SendResults(results);
我不确定依赖IsCompleted 是否是个坏主意;是否会出现无法信任其结果的情况,或者可能再次变回false等情况?
同样,即使在检查了IsCompleted 之后,使用task.Result 会不会很危险,应该总是更喜欢await task 吗?如果使用ValueTask 而不是Task 会怎样?
【问题讨论】:
-
用一种方法(SendResults)处理多个结果重要吗?您可以等待结果并单独发送每个..
-
在这个虚构的例子中,一次处理多个结果并不重要@alexm。
-
单独等待每个结果意味着依次等待每个请求。如果每个请求需要一秒钟并且有 10 个,则用户将不得不等待 10 秒钟。启动所有 10 个并等待所有这些将需要大约 1 秒。我的目标是更快地返回一些结果,例如因为它们是立即可用的缓存结果(例如,100 毫秒后发送 3 个结果,约 1 秒后发送 7 个结果)
-
你在寻找类似Jon Skeet's
OrderByCompletionmethod的东西吗? -
作为旁注,在您的示例中,如果一个任务失败,该任务的异常将立即传播,其余任务将继续运行,无需观察到即发即弃时尚。这是你的意图吗?
标签: c# async-await