C# Language JoinBlock


Exemple

(Recueille 2-3 entrées et les combine dans un tuple)

Comme BatchBlock, JoinBlock <T1, T2,…> peut regrouper des données provenant de plusieurs sources de données. En fait, c'est l'objectif principal de JoinBlock <T1, T2,…>.

Par exemple, un JoinBlock <string, double, int> est un ISourceBlock <Tuple <string, double, int >>.

Comme avec BatchBlock, JoinBlock <T1, T2,…> est capable de fonctionner en mode gourmand et non gourmand.

  • Dans le mode gourmand par défaut, toutes les données proposées aux cibles sont acceptées, même si l'autre cible ne dispose pas des données nécessaires pour former un tuple.
  • En mode non gourmand, les cibles du bloc reporteront les données jusqu'à ce que toutes les cibles se soient vues proposer les données nécessaires à la création d'un tuple. À ce moment, le bloc s'engagera dans un protocole de validation en deux phases. Ce report permet à une autre entité de consommer les données entre-temps afin de permettre au système global d’avancer.

entrer la description de l'image ici

Traitement des demandes avec un nombre limité d'objets groupés

var throttle = new JoinBlock<ExpensiveObject, Request>();
for(int i=0; i<10; i++) 
{
    requestProcessor.Target1.Post(new ExpensiveObject()); 
}

var processor = new Transform<Tuple<ExpensiveObject, Request>, ExpensiveObject>(pair =>
{
    var resource = pair.Item1;
    var request = pair.Item2;
    
    request.ProcessWith(resource);
    
    return resource;
});

throttle.LinkTo(processor);
processor.LinkTo(throttle.Target1);

Introduction à TPL Dataflow par Stephen Toub