2012-07-20 27 views
1

我運行接收不同類型的進程外消息的算法。傳入的消息實際上是字節數組,並且每個字節數組都預先通過指示消息類型的字節數組標誌來標識。我想了解是否可以設置處理傳入字節數組的IPropagator<byte[], byte[]>,解釋字節數組標誌,然後將字節數組傳送到特定的相應鏈接動作塊。TPL Dataflow消息類型分配模式可能嗎?

例如,假設我有2種不同的消息類型,並且我有2個不同的相應ActionBlocks,它們只應接收與他們應該接收的預期消息類型相匹配的消息。我相信如果我只是將IPropagatorBlock連接到兩個ActionBlocks,這兩個ActionBlocks都會收到相同的消息?我怎樣才能正確地分配每個消息,這取決於它的標誌(不要擔心標誌,標識是微不足道的,假設我知道在任何時候ActionBlock IPropgatorBlock想要流式傳輸消息)?我正在努力正確設置數據流結構。我希望能夠將數據塊直接鏈接到對方,而不必Post()。那可能嗎?

在這方面的任何幫助非常感謝。

回答

1

這取決於您使用的IPropagatorBlock。如果是自定義的,你可以做任何事情,包括例如根據它們鏈接的順序(或更可靠的東西)識別要使用哪個目標塊。

不過,假設該塊實際上是一個正常TransformBlock(或類似的東西),我認爲最好的選擇是使用the overload of LinkTo() that takes a predicate,並加入標誌以輸出類型(這意味着改變塊的類型IPropagatorBlock<byte[], Tuple<FlagType, byte[]>>,或自定義類型而不是Tuple)。如果你這樣做,那麼只有當目標的謂詞與消息匹配時,你才能確定目標會收到消息。

此外,如果將一個源塊鏈接到更多目標塊會發生什麼情況取決於源塊。在大多數情況下,它會將每條消息發送到一個目標:它首先嚐試第一個目標,並且只在第一個目標拒絕或推遲消息時嘗試第二個目標。此規則的例外是BroadcastBlock(和類似的WriteOnceBlock),它總是嘗試將每條消息發送給所有目標。同樣,自定義塊可以以任何想要的方式運行。

+0

我會自己測試它,但是你的預感使用謂詞/過濾器的方法與在變換塊中手動分配的方式相比有多快,然後根據標記的內容簡單發佈到Actionblocks。 (顯然不需要一個轉換塊,但是需要一個動作塊來發布到其他動作塊,顯然不是最漂亮的方式,但是你認爲它會比使用謂詞更快還是更慢? – 2012-07-20 15:00:08

+0

我認爲使用謂詞會有非常小的性能損失。你有很多的目標,然後線性搜索正確的目標可能是一個問題,但這似乎並不是你的情況。 – svick 2012-07-20 15:12:11

+0

我試過了:圓滑的解決方案,速度非常快,非常感謝。因爲我有使用ZeroMQ作爲消息傳遞系統的傳入消息,或者只有一個傳入的套接字,並將不同的消息類型分配給其各自的動作塊進行處理,或者爲每個消息類型設置一個套接字,並且必須編寫大量編寫事件處理程序的代碼並將事件轉發給另一個類。我喜歡嘗試這種方法,因爲我想同時處理這些方法。 – 2012-07-20 15:26:50

相關問題