簡體   English   中英

如何在 TPL 數據流中將多個目標塊與一個源塊鏈接起來?

[英]How do I link multiple target blocks with a source block in TPL Dataflow?

我預計以下內容會從兩個發布者中產生 output,但它只從第一個發布者中產生 output:

var broadcastBlock = new BroadcastBlock<int>(null);
var transformBlock = new TransformBlock<int, int>(i => i*10);
var publish1 = new ActionBlock<int>(i => Console.WriteLine("Publisher 1:" + i));
var publish2 = new ActionBlock<int>(i => Console.WriteLine("Publisher 2:" + i));

broadcastBlock.LinkTo(transformBlock, new DataflowLinkOptions() { PropagateCompletion = true });
transformBlock.LinkTo(publish1, new DataflowLinkOptions() { PropagateCompletion = true });
transformBlock.LinkTo(publish2, new DataflowLinkOptions() { PropagateCompletion = true });

foreach (var i in Enumerable.Range(0, 5))
{
    broadcastBlock.Post(i);
}
broadcastBlock.Complete();
Task.WhenAll(publish1.Completion, publish2.Completion).Wait();

我顯然在這里缺少一些基本的東西,有什么想法嗎?

您正在將2個ActionBlock鏈接到單個TransformBlock 您應該將2個ActionBlock鏈接到BrodcastBlock並將BroadcastBlock鏈接到TransformBlock

你有什么:

BroadCast => Transfrom => ActionBlock
                       => ActionBlock

你需要什么:

Transfrom => BroadCast => ActionBlock
                       => ActionBlock

我不能在上面發表評論,但我認為我在 BroadcastBlock 上的發現對某人有用:

  • 只要您廣播到沒有設置“DataflowBlockOptions.BoundedCapacity”的塊,那么所有消息都將被傳遞。
  • 確保您的源塊是您鏈接的最后一個。 我發現如果先鏈接它就可以創建競爭條件。 源和廣播塊可以在目標塊鏈接之前處理消息。 這取決於應用程序,但在我的簡單測試中,我只會在我的目標/操作塊中看到最后一條消息。

編輯:注意到我的第二條評論與 OP 無關,因為他們是如何構建它的,但是我遇到了一些事情,因為我的 SourceBlock 被填充在一個任務中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM