簡體   English   中英

TPL Dataflow,如何將項目轉發到許多鏈接目標塊中的一個特定目標塊?

[英]TPL Dataflow, how to forward items to only one specific target block among many linked target blocks?

我正在尋找一個TPL數據流塊解決方案,它可以容納多個項目,可以鏈接到多個目標塊,但是它能夠將項目轉發到僅通過過濾器/謂詞的特定目標塊。 任何時候都不應該將項目同時傳遞給多個目標塊,始終只能傳遞給與過濾器匹配的項目,或者可以丟棄該項目。 我不喜歡BroadCastBlock,因為如果我理解正確,它不能保證傳送(或者是嗎?)並且過濾是在目標塊側完成的,這意味着BroadCastBlock基本上將每個項目的副本發送到所有linkedTo目標塊。 如果我理解正確,它也不會在任何時候持有多個項目。 我不想使用Post / Async但維護LinkTo鏈。

有沒有辦法繞過完整的自定義數據流塊? 或者我誤解了BroadCastBlock的工作原理? 不幸的是,實際上沒有太多文檔可以詳細介紹並涵蓋用例。 任何想法都受到高度贊賞。

如果我理解正確,您可以通過一個簡單的BufferBlock來完成,它將鏈接到帶謂詞的所有目標塊。 您還可以(無條件地)將其鏈接到NullTarget ,以丟棄不匹配的項目。

就像是:

var forwarder = new BufferBlock<SomeType>();
forwarder.LinkTo(target1, item => matchesTarget1(item));
forwarder.LinkTo(target2, item => matchesTarget2(item));
forwarder.LinkTo(DataflowBlock.NullTarget<SomeType>());

這樣,每個項目將被發送到匹配的第一個目標(如果有的話)。

如果要將每個項目發送到多個目標,或者如果要在目標塊不夠快的情況下丟棄項目,則BroadcastBlock非常有用。

使用BroadcastBlock ,如果沒有塊接受它們,則可以刪除項目(即使它們稍后可以接受它)。 但它不會隨機丟棄項目,所以如果您的目標塊沒有設置BoundedCapacity ,我認為您可以確定它們將獲得所有不會拒絕的項目(例如,通過在LinkTo()使用謂詞) 。

我發現接受的答案是不正確的。 NullTarget應該與其謂詞相關聯,這是對消費者的否定。 否則,您可能會刪除要使用的消息。

var forwarder = new BufferBlock<SomeType>();
forwarder.LinkTo(target1, item => matchesTarget1(item));
forwarder.LinkTo(target2, item => matchesTarget2(item));
forwarder.LinkTo(DataflowBlock.NullTarget<SomeType>(), item => !matchesTarget1(item) && !matchesTarget2(item));

暫無
暫無

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

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