如何获取 Channel<T> 中的元素数量?

Mil*_*yas 2 c# channel .net-core system.threading.channels

我正在规划一个订阅者和发布者系统,我计划在其中使用频道。我想记录我使用的每个通道中的元素数量,以便我可以根据系统中的瓶颈调整发布者/订阅者的数量。

我开始将Channel,ChannelReader和包装ChannelWriter到我自己的类中来计算写入和读取的数量,但这感觉就像一个黑客。有没有更好的办法?

Ant*_*hyy 5

使用来源,卢克。消息来源告诉您,(a) 没有公共 API 可以做到这一点,(b) 您可以使用反射来获取ItemsCountForDebugger有界和无界通道上私有属性的值,(c) 尽管没有锁定,但这是安全的吸气剂。当然,这是一个黑客行为。反射 hack 是否比包装类 hack 更好是一个品味问题。Channel<T> 早在 2018 年就曾请求提供用于获取 a 中大致元素数量的公共 API ,并将在 .NET Core 5.0 中添加(预计于 11 月发布)。

更新:在net5.0及更高版本中,ChannelReader有一个Count属性. 它返回有界通道和具有多个读取器的无界通道的实现的项目计数System.Threading.Channels,但在单消费者无界通道的实现中,此属性会引发异常。我的旧评论仍然适用于这种情况。