C# Language BatchedJoinBlock


Exemple

(Recueille un certain nombre d'éléments totaux de 2-3 entrées et les regroupe dans un Tuple de collections d'éléments de données)

BatchedJoinBlock <T1, T2,…> est en quelque sorte une combinaison de BatchBlock et de JoinBlock <T1, T2,…>.
Alors que JoinBlock <T1, T2,…> est utilisé pour agréger une entrée de chaque cible dans un tuple et que BatchBlock est utilisé pour agréger N entrées dans une collection, BatchedJoinBlock <T1, T2,…> est utilisé pour collecter N entrées toutes les cibles en tuples de collections.

entrer la description de l'image ici

Scatter / Gather

Considérons un problème de dispersion / rassemblement où N opérations sont lancées, dont certaines peuvent réussir et produire des sorties de chaînes, et d'autres peuvent échouer et produire des exceptions.

var batchedJoin = new BatchedJoinBlock<string, Exception>(10);

for (int i=0; i<10; i++)
{
    Task.Factory.StartNew(() => {
        try { batchedJoin.Target1.Post(DoWork()); }
        catch(Exception ex) { batchJoin.Target2.Post(ex); }
    });
}

var results = await batchedJoin.ReceiveAsync();

foreach(string s in results.Item1) 
{
    Console.WriteLine(s);
}

foreach(Exception e in results.Item2) 
{
    Console.WriteLine(e);
}

Introduction à TPL Dataflow par Stephen Toub