2017-10-12 2 views
-2

複数の非同期タスクを実行し、すべての結果を待つために次のコードがあります。複数の非同期タスクを返すときにどのような結果がどのタスクから来たのかを知る方法は?

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

あなたはおそらくすでにhttps://www.bing.com/search?q=c%23+whenall+matchingました+ results + to + parametersそしてすべての結果を得る方法を知っています...今あなたは正確に何を知らないのですか? –

+0

こんにちはアレクセイ、私はこのリンクが示すような結果を得ることができます。しかし、結果セットでは、どの結果がどのstorenameから来たのかをどのように知ることができますか? – Mort

+0

検索結果にドキュメントへのリンクが表示されているのかどうかはわかりません。おそらく、私は答えとして貼り付けています。 –

答えて

0

これは質問への直接的な回答ではありませんが、マイクロソフトのリアクティブフレームワークを使用して、このコードをもっときれいにすることができます。

あなたはこれを書くことができます。

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 }の匿名の変数の配列です。

1つの利点は、それらが利用可能になると、あなたが値を処理できることです。

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

MSDNでは同じインデックスを使用して、 。

WhenAll

タスクのいずれも故障しないと、タスクのどれがキャンセルされなかった場合、得られたタスクがTaskStatus.RanToCompletion状態で終了します。返されたタスクの結果は、提供されたタスクのすべての結果を、それらが提供されたのと同じ順序で含む配列に設定されます(たとえば、入力タスクの配列にt1、t2、t3が含まれる場合、出力タスクのResultはTResult []ここで、arr [0] == t1.Result、arr [1] == t2.Result、arr [2] == t3.Result)。

関連する問題