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