【发布时间】:2019-10-07 00:29:19
【问题描述】:
我需要运行多个等待的任务,然后将它们的结果收集到一个列表中并返回它。
我可以在循环中创建任务并使用 Task.WhenAll 来等待它们,但我不知道如何访问每个等待任务的结果。我尝试了以下但未定义结果。
List<Service> services = new List<Service>();
List<Exception> exceptions = new List<Exception>();
List<Task<Service>> tasks = new List<Task<Service>>();
foreach (string serviceMoniker in monikers)
{
try
{
tasks.Add(GetService(serviceMoniker, tenantMoniker, countryCode, environmentId));
}
catch (Exception e) { exceptions.Add(e); }
}
var continuation = Task.WhenAll(tasks);
for (int i=0; i < continuation.Result.Length - 1; i++)
{
services.Add(continuation.Result[i].Result);
}
又一次尝试
await Task.WhenAll(tasks);
foreach (Task t in tasks)
{
services.Add(t.Result);
}
【问题讨论】:
-
当你等待任务时。whenall 你会得到一个数组中的所有结果。
-
我相信你在错误的地方检查异常:调用
tasks.Add(…)时你不会看到异常,但你会看到一些任务是faulted为引发了未处理的异常。 -
使用await关键字一般比通过访问.Result来阻塞要好:Services[] services = await Task.WhenAll(tasks);
-
@stannius 没有任何阻塞(至少在所示的第二次尝试中没有)。我只是做错了循环。
标签: c# asynchronous