2013-04-25 41 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.

换句话说...插入块接受和传递的第一个数据项,并拼接出的数据流中。

相关问题