不同类型的待处理任务

4
IEnumerable<Task<Request>> requestTasks = CreateRequestTasks();
Task<Trace> traceTask = CreateTraceTask();

var tasks = new List<Task>();
tasks.AddRange(requestTasks);
tasks.Add(traceTask);

await Task.WhenAll(tasks);

我该如何从requestTasks集合中获取结果?


foreach(var meTask in tasks) /*get result/*meTask.Result; ? Or even simplier foreach(Task<Request> meTask in requestTasks) meTask.Result; - mrogal.ski
@m.rogalski 的意思是 Result 是一个同步阻塞等待。 - juharr
但是当您等待所有任务完成后,结果应该立即可用。至少根据我所了解的情况来看。 - mrogal.ski
@m.rogalski 是的,但 async-await 的整个意义在于在等待任务完成时不阻塞线程。 - juharr
我不明白你的观点。他在这里等待这些任务 await Task.WhenAll(tasks);,所以在这些任务完成后,他可以使用 foreach 来检索结果(之前在任务中生成的结果)。或者也许我在这里漏掉了什么。 - mrogal.ski
显示剩余2条评论
2个回答

11

我该如何从requestTasks集合中获取结果?

将其保留为单独的(具象化的)集合:

List<Task<Request>> requestTasks = CreateRequestTasks().ToList();
...
await Task.WhenAll(tasks);
var results = await Task.WhenAll(requestTasks);

请注意,第二个await Task.WhenAll实际上不会进行任何"异步等待",因为所有这些任务都已经完成。


1
我原以为第二个await可能会导致任务的第二次执行。感谢您的澄清! - Naeem Sarfraz

2
"既然你必须等待它们全部到齐,你可以简单地写下:

"
IEnumerable<Task<Request>> requestTasks = CreateRequestTasks();
Task<Trace> traceTask = CreateTraceTask();

var tasks = await Task.WhenAll(requestTasks);
var trace = await traceTask;

在等效的 async 块内部:在我看来可能更清晰。
还要注意,上述的 traceTask 在创建时就开始了(实际上这是相同的答案,因为问题本身是重复的)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接