2017-09-19 16 views
-1

長時間実行されている仕事が多いジョブを提出できるWebアプリケーションがあります。私は、ウェブアプリケーションがプログレスバーを表示できるようにyield returnを使用していますが、これにより同期実行が強制されます。私がやりたい何歩留まりが並行して復帰する

は、タスクの私のリストを取り、それらを並行して実行しますが、それでもユーザーにフィードバックを提供します。以下のコードで

、私はまだ推測するために、各呼び出しの後リターンを得たいが、私は並列でループを実行したいと思います。これが収量では不可能な場合、私の選択肢は何ですか?私は何をしたいのか具体的に

は、小さなコレクションへの要求を分割され、それらの小さなコレクションは、並列に実行しました。

質問の目的として、「要求」を「要求1」と「要求2」に分割し、それらを並列に実行しながら各項目の完了後に呼び出し元に戻すことができるようにします。

public IEnumerable<AnnotationRequest> Infer(List<Uri> fileUris, CancellationToken? token) 
    { 
     var requests = fileUris.Select(uri => new AnnotationRequest() { Uri = uri }).ToList(); 

     foreach (var result in Infer(requests, token)) 
     { 
      yield return result; 
     } 
    } 
+2

あなたの質問は非常に広いようです。多くの異なる方法があります。グループごとに別々のタスクを開始し、各メソッドの結果を上記のメインメソッド/スレッドの 'GetConsumingEnumerable()'で列挙する 'BlockingCollection()'に追加してみましたか? –

答えて

1

上記のPeter Dunihoのコメントのおかげで、私は彼の提案とその作業上の罰金として実装しました。

  var collection = new BlockingCollection<AnnotationRequest>(); 

      Task.Run(() => 
      { 
       Parallel.ForEach(requests, (request) => 
       { 
        foreach (var result in Infer(request, token)) 
        { 
         collection.Add(result); 
        } 
       }); 

       collection.CompleteAdding(); 
      }); 

      foreach (var result in collection.GetConsumingEnumerable()) 
      { 
       yield return result; 
      } 
関連する問題