2017-08-19 1 views
0

Ich brauche Hilfe bei der Anordnung des Codes in .NET TPL Datenfluss. Hier ist der CodeBessere Verwendung von. NET Datenfluss

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 
       }); 
      } 
     } 
    }); 

Dies ist der letzte Block meiner Kette. Hier ist die Aktionsblockeingabe Category_KeywordsToMatch. Dies ist eine Klasse, die eine Jobkategorie und eine Liste von Keywords enthält, die in einem Lebenslauf übereinstimmen. {Kategorie, Liste < Schlüsselwörter>}. Innerhalb Block verwende ich foreach Schleife, um durch eine Liste von Lebensläufen aufzuzählen. Gibt es ein besseres Design mit Datenfluss, wie Lebenslauf kann als unterschiedliche Eingabe geliefert werden. Der letzte Block ist der letzte Block für eine Kategorie. Ich muss Schlüsselwörter für mehrere Kategorien suchen.

+0

Wenn Ihr 'Resumes' nicht ändert, können Sie die' WriteOnceBlock', oder Sie können es versuchen mit 'BroadcastBlock' passieren könnte, nimmt er den Delegierten Kopieren des Wertes – VMAtm

+0

Danke für die Antwort. Ich möchte wissen, ob ich diesen letzten Block in einer Blockkette aufteilen kann. Ich bin ein Anfänger in TPL-Datenfluss und es gibt nicht viele Tutorials auf dem gleichen. Fortsetzungen ändert sich nicht. Ich dachte daran, ein Tupel eines Lebenslaufs und Category_KeywordsToMatch zu einem anderen Block zu liefern und dann das Endergebnis in weiteren Blöcken zu machen. @VMAtm kannst du mir bitte deinen Skype oder irgendeine andere ID geben, damit ich dich kontaktieren kann. – user3522311

Antwort

0

Angenommen, matchedCandidates_dataflow ist eine threadsichere Sammlung, die Sie verarbeiten können, um die Zusammenfassungen parallel zu vergleichen und sie hinzuzufügen, sobald sie fertig sind. Im Folgenden habe ich einen Beispielcode für eine Möglichkeit hinzugefügt. Wenn Sie zum Beispiel BuildMatchingBlock (4) aufrufen, erhalten Sie einen Block, der sicherstellt, dass Sie bis zu 4 WorkItems in parrallel verarbeiten. Angenommen, Sie arbeiten nur mit der CPU, sollten Sie sicherstellen, dass die Parallelitätsstufe nicht größer ist als die Anzahl der Kerne. Ich entschied mich für die "SendAsync" -Schnittstelle, aber Sie könnten auch "Post" verwenden, stellen Sie sicher, dass Sie die Unterschiede zwischen ihnen verstehen und wählen Sie die, die Ihnen am besten passt. Sie auch einen BoundedCapacity Parameter 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; 
    } 
Verwandte Themen