2 回答
TA贡献1830条经验 获得超9个赞
这似乎不正确,因为它可能会丢失输入。
假设您使用默认值,这是正确的。Post
仅false
当块拒绝输入时才返回。如果模块已接收到Complete
信号,或者模块的输入缓冲区已满,则可能会发生这种情况。默认情况下,每个块的输入缓冲区可以无限增长,因此ActionBlock
具有默认输入缓冲区大小的块只会false
在调用Post
后返回。Complete
最常见的用例ActionBlock
是具有无限的有限容量,并且代码仅Complete
在添加所有项目后调用。在这种情况下,Post
永远不会返回false
,您可以安全地忽略返回值。
TA贡献1875条经验 获得超3个赞
Post如果块完成,或者块的输入缓冲区已满,该方法将返回 false。由于该设置并不是什么奇特的东西,并且很可能在项目的后期阶段需要解决高 RAM 使用率的新问题,因此我认为使用该方法并简单地忽略结果BoundedCapacity并不是一个安全的选择。Post为了避免涉及丢失消息(可能是订单或发票)的无趣错误,您可以执行以下操作:
foreach (var item in items)
{
var accepted = block.Post(item);
if (!accepted) throw new InvalidOperationException("Item was not accepted");
}
这样,您至少会收到有关某些内容损坏的通知,并且不会让错误行为蔓延。
另一方面,等待SendAsync并忽略结果要安全得多。SendAsync通常会在发生异常或发生取消的情况下返回,在这种情况下,您会在块发生时false收到通知。所以在这种情况下不需要抛出异常。awaitCompletion
foreach (var item in items)
{
await block.SendAsync(item).ConfigureAwait(false);
}
出于性能原因,您可以同时使用Post和SendAsync。仅当您有数千万个项目需要处理时,这才会产生影响。
foreach (var item in items)
{
if (!block.Post(item))
{
await block.SendAsync(item).ConfigureAwait(false);
}
}
- 2 回答
- 0 关注
- 138 浏览
添加回答
举报