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
集合中获取结果?
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
集合中获取结果?
我该如何从requestTasks集合中获取结果?
将其保留为单独的(具象化的)集合:
List<Task<Request>> requestTasks = CreateRequestTasks().ToList();
...
await Task.WhenAll(tasks);
var results = await Task.WhenAll(requestTasks);
请注意,第二个await Task.WhenAll
实际上不会进行任何"异步等待",因为所有这些任务都已经完成。
IEnumerable<Task<Request>> requestTasks = CreateRequestTasks();
Task<Trace> traceTask = CreateTraceTask();
var tasks = await Task.WhenAll(requestTasks);
var trace = await traceTask;
async
块内部:在我看来可能更清晰。traceTask
在创建时就开始了(实际上这是相同的答案,因为问题本身是重复的)。
foreach(var meTask in tasks) /*get result/*meTask.Result;
? Or even simplierforeach(Task<Request> meTask in requestTasks) meTask.Result;
- mrogal.skiResult
是一个同步阻塞等待。 - juharrasync-await
的整个意义在于在等待任务完成时不阻塞线程。 - juharrawait Task.WhenAll(tasks);
,所以在这些任务完成后,他可以使用foreach
来检索结果(之前在任务中生成的结果)。或者也许我在这里漏掉了什么。 - mrogal.ski