据我所知,要将数据放入TPL Dataflow目标,我可以使用Post
或SendAsync
,如果该项目可以放入目标,则会立即返回。我明白SendAsync
将等待更长时间才能尝试放入,但我不确定SendAsync
返回false
的含义是什么。TPL Dataflow SendAsync结果
SendAsync
SendAsync
是否返回false
表示目标(特别是BufferBlock
)已完成并将永不接受更多消息?
它可能稍后开始接受消息吗?
据我所知,要将数据放入TPL Dataflow目标,我可以使用Post
或SendAsync
,如果该项目可以放入目标,则会立即返回。我明白SendAsync
将等待更长时间才能尝试放入,但我不确定SendAsync
返回false
的含义是什么。TPL Dataflow SendAsync结果
SendAsync
SendAsync
是否返回false
表示目标(特别是BufferBlock
)已完成并将永不接受更多消息?
它可能稍后开始接受消息吗?
我明白,把数据转换成TPL数据流的目标,我可以使用
Post
或SendAsync
正确
,将立即返回,如果该项目能够投产目标。
不正确 - 其方法都立即返回。如果您使用的是Post
,它也会返回false
。
我明白
SendAsync
会等待更长的时间去尝试的放它在
部分正确。 SendAsync
将设置一个状态机,最终将返回一个结果。
但是我不确定
SendAsync
返回false
是什么意思。
这意味着目标块在当时不能接受消息。
是否
SendAsync
返回false
信号目标(具体为BufferBlock
)已完成,绝不会接受更多的消息?
有很多原因,不仅目标是在完成状态。例如,它自己的缓冲区可能充满了消息,而另一个不适合它(如果您的块受到BoundedCapacity
的限制)。所以你不能肯定地说方法返回false
的原因是完成状态。但是,如果您不限制缓冲区的容量,那很可能是。
以后可能开始接受邮件吗?
不,块的设计方式是只能完成一次。您需要重新创建块并将其插入管道以重新启动它。
我认为运行任务
'SendAsync'首先尝试同步发送消息,因此与当时的'Post'没有区别。如果目标没有提供任何结果,那么方法创建一个状态机并返回一个“任务”,稍后可以完成。例如,如果目标处于故障状态,它仍然可以“假”。您可能会在Github上的代码中看到完整的可能性。 – VMAtm
我的理解是,SendAsync的任务可能会返回false,但将来有一个任务返回true。然而,您在故障状态的评论中给出的例子决不允许再次发送。是否有任何情况SendAsync的任务可以返回false,然后再次发送? – bsagal
无法重新启动块,当块无法接受任何消息时,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