我正在规划一个订阅者和发布者系统,我计划在其中使用 channel 。我想记录我使用的每个 channel 中的元素数量,以便我可以根据系统中的瓶颈调整发布者/订阅者的数量。
我开始将 Channel
、ChannelReader
和 ChannelWriter
包装到我自己的类中来计算写入和读取的次数,但这感觉就像黑客。有更好的办法吗?
最佳答案
Use the source, Luke 。消息来源告诉您,(a) 没有公共(public) API 可以执行此操作,(b) 您可以使用反射来获取私有(private)属性 ItemsCountForDebugger
的值。在有界和无界 channel 上,并且 (c) 尽管 getter 中没有锁定,但这是安全的。当然,这是一个黑客行为。反射 hack 是否比包装类 hack 更好是一个品味问题。用于获取 Channel<T>
中元素的大致数量的公共(public) API was requested back in 2018 ,并将添加到 .NET Core 5.0(预计于 11 月发布)中。
更新:在net5.0及更高版本中,ChannelReader
有一个 Count
property 。它返回 System.Threading.Channels
的项目计数。有界 channel 和具有多个读取器的无界 channel 的实现,但在单消费者无界 channel 的实现中,此属性会引发异常。我的旧评论仍然适用于这种情况。
关于c# - 如何获取 Channel<T> 中的元素数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60336191/