C# Language TransformManyBlock


Exemple

(SelectMany, 1-m: les résultats de ce mappage sont «aplatis», tout comme le SelectMany de LINQ)

TransformManyBlock <TInput, TOutput> est très similaire à TransformBlock <TInput, TOutput>.
La principale différence est qu'un TransformBlock <TInput, TOutput> produit une et une seule sortie pour chaque entrée, TransformManyBlock <TInput, TOutput> produit un nombre quelconque (zéro ou plus) de sorties pour chaque entrée. Comme avec ActionBlock et TransformBlock <TInput, TOutput>, ce traitement peut être spécifié à l'aide de délégués, à la fois pour le traitement synchrone et asynchrone.

Un Func <TInput, IEnumerable> est utilisé pour synchrone et un Func <TInput, Task <IEnumerable >> est utilisé pour asynchrone. Comme avec ActionBlock et TransformBlock <TInput, TOutput>, TransformManyBlock <TInput, TOutput> utilise par défaut un traitement séquentiel, mais peut être configuré autrement.

Le délégué de mappage exécute une collection d'éléments qui sont insérés individuellement dans le tampon de sortie.

entrer la description de l'image ici

Asynchrone Web Crawler

var downloader = new TransformManyBlock<string, string>(async url =>
{
    Console.WriteLine(“Downloading “ + url);
    try 
    { 
        return ParseLinks(await DownloadContents(url)); 
    } 
    catch{}
    
    return Enumerable.Empty<string>();
});
downloader.LinkTo(downloader);

Élargir un Enumerable dans ses éléments constitutifs

var expanded = new TransformManyBlock<T[], T>(array => array);

Filtrage en passant de 1 à 0 ou 1 éléments

public IPropagatorBlock<T> CreateFilteredBuffer<T>(Predicate<T> filter)
{
    return new TransformManyBlock<T, T>(item =>
        filter(item) ? new [] { item } : Enumerable.Empty<T>());
}

Introduction à TPL Dataflow par Stephen Toub