返回多个异步任务时,如何知道哪个结果来自哪个任务?

时间:2017-10-12 00:50:53

标签: c# async-await task

我有以下代码来运行多个异步任务并等待所有结果。

string[] personStoreNames = _faceStoreRepo.GetPersonStoreNames();    
IEnumerable<Task<IdentifyResult[]>> identifyFaceTasks =
        personStoreNames.Select(storename => _faceServiceClient.IdentifyAsync(storename, faceIds, 1));
      var recognitionresults =
        await Task.WhenAll(identifyFaceTasks);

当我得到结果时,我如何获得每个任务结果的商店名称。每个IdentifyResult数组都将用于某个商店名称,但我不确定如何最终得到我的IdentifyResults以及它们所在的商店名称。

2 个答案:

答案 0 :(得分:5)

正如MSDN所说,使用相同的索引来获得用于参数的结果。

WhenAll

  

如果没有任何任务出现故障且没有任何任务被取消,则生成的任务将以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();

resultnew { sn, irs }的匿名变量数组。

一个优点是您可以在值可用时处理它们:

var result = await query
    .Do(x => { /* process each `x.sn` & `x.irs` pair as they arrive */ })
    .ToArray();