我有以下代码来运行多个异步任务并等待所有结果。
string[] personStoreNames = _faceStoreRepo.GetPersonStoreNames();
IEnumerable<Task<IdentifyResult[]>> identifyFaceTasks =
personStoreNames.Select(storename => _faceServiceClient.IdentifyAsync(storename, faceIds, 1));
var recognitionresults =
await Task.WhenAll(identifyFaceTasks);
当我得到结果时,我如何获得每个任务结果的商店名称。每个IdentifyResult数组都将用于某个商店名称,但我不确定如何最终得到我的IdentifyResults以及它们所在的商店名称。
答案 0 :(得分:5)
正如MSDN所说,使用相同的索引来获得用于参数的结果。
如果没有任何任务出现故障且没有任何任务被取消,则生成的任务将以TaskStatus.RanToCompletion状态结束。返回任务的结果将被设置为一个数组,其中包含所提供任务的所有结果,其顺序与提供的顺序相同(例如,如果输入任务数组包含t1,t2,t3,输出任务&#39; s结果将返回一个TResult [],其中arr [0] == t1.Result,arr [1] == t2.Result,和arr [2] == t3.Result)。
答案 1 :(得分:0)
这不是问题的直接答案,但您可以使用Microsoft的Reactive Framework使这段代码更整洁。
你可以这样写:
var query =
from sn in _faceStoreRepo.GetPersonStoreNames().ToObservable()
from irs in Observable.FromAsync(() => _faceServiceClient.IdentifyAsync(sn, faceIds, 1))
select new { sn, irs };
var result = await query.ToArray();
result
是new { sn, irs }
的匿名变量数组。
一个优点是您可以在值可用时处理它们:
var result = await query
.Do(x => { /* process each `x.sn` & `x.irs` pair as they arrive */ })
.ToArray();