C# Language BroadcastBlock


Exemple

(Copier un article et envoyer les copies à chaque bloc auquel il est lié)

Contrairement à BufferBlock, la mission de BroadcastBlock dans la vie est de permettre à toutes les cibles liées à partir du bloc d'obtenir une copie de chaque élément publié, en écrasant continuellement la valeur «actuelle» avec celles qui lui sont propagées.

En outre, contrairement à BufferBlock, BroadcastBlock ne conserve pas inutilement les données. Après qu'une donnée particulière a été offerte à toutes les cibles, cet élément sera écrasé par n'importe quelle donnée suivante (comme pour tous les blocs de flux de données, les messages sont traités dans l'ordre FIFO). Cet élément sera offert à toutes les cibles, et ainsi de suite.

entrer la description de l'image ici

Producteur / consommateur asynchrone avec un producteur étranglé

var ui = TaskScheduler.FromCurrentSynchronizationContext();
var bb = new BroadcastBlock<ImageData>(i => i);

var saveToDiskBlock = new ActionBlock<ImageData>(item =>
    item.Image.Save(item.Path)
);

var showInUiBlock = new ActionBlock<ImageData>(item =>
    imagePanel.AddImage(item.Image), 
    new DataflowBlockOptions { TaskScheduler = TaskScheduler.FromCurrentSynchronizationContext() }
);

bb.LinkTo(saveToDiskBlock);
bb.LinkTo(showInUiBlock);

Statut d'exposition d'un agent

public class MyAgent
{
    public ISourceBlock<string> Status { get; private set; }
    
    public MyAgent()
    {
        Status = new BroadcastBlock<string>();
        Run();
    } 

    private void Run()
    {
        Status.Post("Starting");
        Status.Post("Doing cool stuff");
        …
        Status.Post("Done");
    }
}

Introduction à TPL Dataflow par Stephen Toub