2017-08-17 121 views
1

据我所知,要将数据放入TPL Dataflow目标,我可以使用PostSendAsync,如果该项目可以放入目标,则会立即返回。我明白SendAsync将等待更长时间才能尝试放入,但我不确定SendAsync返回false的含义是什么。TPL Dataflow SendAsync结果

SendAsyncSendAsync是否返回false表示目标(特别是BufferBlock)已完成并将永不接受更多消息?
它可能稍后开始接受消息吗?

+0

无法重新启动块,当块无法接受任何消息时,SendAsync将返回false。解答是:[SendAsync](https:// stackoverflow。com/questions/13599305/tpl-dataflow-whats-the-function-difference-between-post-and-sendasync)和[Restarting block](https://stackoverflow.com/questions/15967903/task-dataflow-can -a-data-block-be-changed-from-completion-state) – JSteward

回答

0

我明白,把数据转换成TPL数据流的目标,我可以使用PostSendAsync

正确

,将立即返回,如果该项目能够投产目标。

不正确 - 其方法都立即返回。如果您使用的是Post,它也会返回false

我明白SendAsync会等待更长的时间去尝试的放它在

部分正确。 SendAsync将设置一个状态机,最终将返回一个结果。

但是我不确定SendAsync返回false是什么意思。

这意味着目标块在当时不能接受消息。

是否SendAsync返回false信号目标(具体为BufferBlock)已完成,绝不会接受更多的消息?

有很多原因,不仅目标是在完成状态。例如,它自己的缓冲区可能充满了消息,而另一个不适合它(如果您的块受到BoundedCapacity的限制)。所以你不能肯定地说方法返回false的原因是完成状态。但是,如果您不限制缓冲区的容量,那很可能是。

以后可能开始接受邮件吗?

不,块的设计方式是只能完成一次。您需要重新创建块并将其插入管道以重新启动它。

+0

我认为运行任务的'''SendAsync''的要点是它可以等待缓冲区清除。如果缓冲区满了也会导致''''SendAsync'''返回'''''''''''Post'''有什么不同?在什么情况下使用完整缓冲区会导致SendAsync''在任务中返回''false''',而不是等待更长时间直到缓冲区清除? – bsagal

+0

'SendAsync'首先尝试同步发送消息,因此与当时的'Post'没有区别。如果目标没有提供任何结果,那么方法创建一个状态机并返回一个“任务”,稍后可以完成。例如,如果目标处于故障状态,它仍然可以“假”。您可能会在Github上的代码中看到完整的可能性。 – VMAtm

+0

我的理解是,SendAsync的任务可能会返回false,但将来有一个任务返回true。然而,您在故障状态的评论中给出的例子决不允许再次发送。是否有任何情况SendAsync的任务可以返回false,然后再次发送? – bsagal