C# TPL数据流发送异步结果

C# TPL数据流发送异步结果,c#,.net,tpl-dataflow,C#,.net,Tpl Dataflow,我理解,要将数据放入TPL数据流目标,我可以使用Post或sendascync,如果项目可以放入目标,则会立即返回。我知道SendAsync将等待更长的时间尝试输入,但我不确定SendAsync返回false的含义 sendsync返回的false是否表示目标(特别是BufferBlock)已完成,并且永远不会接受更多消息? 它是否可能稍后开始接受邮件 我知道,要将数据放入TPL数据流目标,我可以使用Post或SendAsync 正确的 如果物品可以放入目标,它会立即返回 不正确-其方法都会立即

我理解,要将数据放入TPL数据流目标,我可以使用
Post
sendascync
,如果项目可以放入目标,则会立即返回。我知道
SendAsync
将等待更长的时间尝试输入,但我不确定
SendAsync
返回
false
的含义

sendsync
返回的
false
是否表示目标(特别是
BufferBlock
)已完成,并且永远不会接受更多消息?
它是否可能稍后开始接受邮件

我知道,要将数据放入TPL数据流目标,我可以使用
Post
SendAsync

正确的

如果物品可以放入目标,它会立即返回

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

我知道
SendAsync
将等待更长的时间来尝试将其放入

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

但是,我不确定
SendAsync
返回
false
的含义是什么

这意味着目标块此时无法接受消息

sendsync
返回的
false
是否表示目标(特别是
BufferBlock
)已完成,并且永远不会接受更多消息

原因有很多,不仅仅是目标处于完成状态。例如,它自己的缓冲区可能满是消息,而另一个缓冲区不适合它(如果您的块受
BoundedCapacity
约束)。因此,您无法确定方法返回
false
的原因是完成状态。然而,如果你不限制缓冲区的容量,它很可能是

它是否可能稍后开始接受邮件


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

无法重新启动块,并且当块无法接受任何消息时,
sendsync
将返回
false
。答案是:我认为运行任务的
SendAsync
的要点是它可以等待缓冲区清除。如果缓冲区已满,也会导致
SendAsync
返回
false
Post
有什么区别?在什么情况下,缓冲区已满会导致任务中的
sendsync
返回
false
,而不会等待更长的时间直到缓冲区清除?
sendsync
首先尝试同步发送消息,因此与当时的
Post
没有区别。若目标不提供任何结果,那个么该方法将创建一个状态机并返回一个
任务
,该任务可能稍后完成。例如,如果目标处于故障状态,它仍然可以
false
。您可以在Github上的代码中看到全部可能性。从您最初的回答中,我了解到
SendAsync
任务可能返回
false
,但将来会有一个任务返回
true
。但是,您在错误状态注释中给出的示例将永远不允许再次发送。是否有任何情况下,
SendAsync
任务可能返回
false
,然后允许再次发送?不,我不是这个意思。一个任务不能返回两个不同的结果
SendAsync
返回一个
任务
,而不是我的意思是
布尔值
。@bsagal这没有文档记录,所以理论上你不应该依赖它。实际上,它看起来无法返回
true
,但仍然没有文档记录。