BroadcastBlockT

(复制项目并将副本发送到与其链接的每个块)

与 BufferBlock 不同,BroadcastBlock 的生命任务是使从块中链接的所有目标都能获得发布的每个元素的副本,并不断地用传播到它的那些元素覆盖当前值。

此外,与 BufferBlock 不同,BroadcastBlock 不会不必要地保留数据。在向所有目标提供特定数据之后,该元素将被下一行中的任何数据覆盖(与所有数据流块一样,消息按 FIFO 顺序处理)。该元素将提供给所有目标,依此类推。

StackOverflow 文档

具有限制生产者的异步生产者/消费者

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

从代理公开状态

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

Stephen Toub 介绍 TPL 数据流