2013-04-25 42 views
2

我想知道在輸入緩衝區中接收到第一個項目還是在數據塊中處理第一個項目時,是否可以訂閱一次性通知。我知道我可以在數據塊中設置一個標誌,但是會產生開銷,因爲它會運行檢查每個新項目上的標誌。我的數據塊處理數百萬項,因此這個標誌增加了不必要的開銷。TPL數據流,數據塊收到第一個項目時的通知

有沒有更好的方法來通知第一個來件物品?

+0

也許將輸入緩衝區連接到'BroadcastBlock',然後它將鏈接到您的主數據流和['WriteOnceBlock '](http://msdn.microsoft.com/zh-cn/library/hh194820.aspx) ? 'WriteOnceBlock'只會被寫入一次(第一項)... – 2013-04-25 13:09:47

+0

你真的說檢查單個'bool'是不必要的開銷嗎?我不信。你有沒有試過測量這個? – svick 2013-04-25 14:04:31

+0

嗯,絕對是一個整潔的想法,使用WriteOnceBlock。無論如何,我都使用廣播塊,這樣就可以工作。我想我不必處理隨後被拒絕的消息,因爲項目是通過廣播塊流式傳輸的,對嗎? – 2013-04-25 14:05:00

回答

1

您可以嘗試使用MaxMessages = 1創建一個鏈接到處理通知的塊。此鏈接將在傳遞單個消息後被刪除。

+0

但是對於普通塊來說,這意味着只有這個塊纔會收到通知,常規目標不會。 – svick 2013-07-28 10:33:10

+0

嗯,你說得對。您可以讓通知塊將消息傳遞給常規目標,但這可能意味着消息會重新排序。或者你可以用廣播塊來解決這個問題,在這種情況下應該已經有了。 – pkt 2013-07-29 06:56:08

0

(我知道這11個月太晚了......但我希望有人能告訴我,爲什麼這不是一個好主意回答。)

你有一個特定塊X其中你想知道它什麼時候收到第一條消息。它有一個上游塊。在上游塊和塊X之間插入一個TransformBlock,將其從上游塊與MaxMessages = 1鏈接起來,以便在獲得第一條消息時立即取消鏈接。這也阻止了上游區塊。插入的TransformBlock的Func在其代理中做了3件事:

  1. 是否發出您希望「收到第一個數據塊」的通知。
  2. 將其後續塊X鏈接到上游塊。
  3. 返回其參數不變,以獲得通過阻止X.

換句話說...插入塊接受和傳遞的第一個數據項,並拼接出的數據流中。

相關問題