2017-08-19 5 views
0

.NET TPLデータフローでコードを整理すると助けが必要です。ここにコードは.net dataflowの使用を改善しました

var finalBlock = new ActionBlock<Category_KeywordsToMatch>(x => 
    { 
     List<Resume> Resumes = new List<Resume>(); 

     using (var context = new IndepthRecruitDbContext()) 
     { 
      Resumes = context.Resumes.Include("Candidate").ToList(); 
     } 
     foreach (var res in Resumes) 
     { 
      var keywords = FindKeywords(x.KeywordsToMatch, res); 
      if (keywords.Count > 0) 
      { 
       matchedCandidates_dataflow.Add(new MatchedCandidate 
       { 
        Id = res.CandidateId, 
        Name = res.Candidate.Name, 
        Url = res.Url, 
        Uploaded = res.DateUploaded.ToShortDateString(), 
        MatchedKeywordsList = keywords 
       }); 
      } 
     } 
    }); 

これは私のチェーンの最後のブロックです。ここでアクションブロックの入力はCategory_KeywordsToMatchであり、ジョブカテゴリと、履歴書で一致するキーワードのリストを含むクラスです。 {カテゴリ、リスト<キーワード>}。ブロック内では、私はforeachループを使用して履歴書のリストを列挙しています。 レジュメを別の入力として提供できるように、データフローを使用するより優れたデザインはありますか? 最終ブロックは、1つのカテゴリの最後のブロックです。私は複数のカテゴリのキーワードを検索する必要があります。

+0

にBoundedCapacityパラメータを渡すことができ、またはあなたがそれをBroadcastBlock' 'と試してみることがあり、それがために、デリゲートを受け入れます値をコピーします。 – VMAtm

+0

お返事ありがとうございます。私はこの最終ブロックをいくつかの連鎖で分割することができますか?私はtplデータフローの初心者であり、同じチュートリアルはあまりありません。履歴書は変更されません。私は、レジュメとCategory_KeywordsToMatchのタプルを他のブロックに供給し、さらにブロックで最終結果を作ることを考えていました。 @VMAtmあなたに私があなたに連絡できるように、あなたは私にあなたのスカイプまたは他の誰かのIDを教えてください。 – user3522311

答えて

0

matchesCandidates_dataflowがスレッドセーフなコレクションであると仮定すると、parrallelの履歴書と一致するものを処理し、準備が整ったら追加できます。 以下に、それを行うための方法のサンプルコードを添付しました。 たとえば、BuildMatchingBlock(4)を呼び出すと、parralelで最大4つのWorkItemを処理するブロックが作成されます。 CPUの処理だけを行うと仮定すると、並列度のレベルがコアの数よりも大きくないことを確認することをお勧めします。私は "SendAsync"インターフェースを使うことを選択しましたが、 "Post"も使うことができました。それらの違いを理解し、あなたに一番合ったものを選んでください。また、あなたの `Resumes`が変わらない場合は、あなたが` WriteOnceBlock`を行うことができますExecutionDataflowBlockOptions

private class WorkItem 
    { 
     public Category_KeywordsToMatch CategoryKeywordsToMatch { get; set; } 
     public Resume Resume { get; set; } 
     public WorkItem(Category_KeywordsToMatch c, Resume r) 
     { 
      CategoryKeywordsToMatch = c; 
      Resume = r; 
     } 
    } 

    private ActionBlock<Category_KeywordsToMatch> BuildMatchingBlock(int matchingParallelism) 
    { 
     var finalBlock = new ActionBlock<WorkItem>(
      workItem => 
      { 
       var keywords = FindKeywords(workItem.CategoryKeywordsToMatch.KeywordsToMatch, workItem.Resume); 
       if (keywords.Count > 0) 
       { 
        // match... 
       } 
      }, 
      new ExecutionDataflowBlockOptions() { MaxDegreeOfParallelism = matchingParallelism }); 

     var preparatorBlock = new ActionBlock<Category_KeywordsToMatch>(
      async x => 
      { 
       List<Resume> Resumes = new List<Resume>(); 
       // load resumes... 

       foreach (var res in Resumes) 
       { 
        await finalBlock.SendAsync(new WorkItem(x, res)).ConfigureAwait(false); 
       } 
      }); 

     return preparatorBlock; 
    } 
関連する問題