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 資料流