(复制一个项目并将副本发送到它链接到的每个块)
与 BufferBlock 不同,BroadcastBlock 的任务是让所有从该块链接的目标获得发布的每个元素的副本,不断用传播给它的值覆盖“当前”值。
此外,与 BufferBlock 不同,BroadcastBlock 不会不必要地保留数据。在向所有目标提供特定数据后,该元素将被下一行的任何数据覆盖(与所有数据流块一样,消息按 FIFO 顺序处理)。该元素将提供给所有目标,依此类推。
具有节流生产者的异步生产者/消费者
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"); } }