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

标签 c# .net-core channel system.threading.channels

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

我开始将 ChannelChannelReaderChannelWriter 包装到我自己的类中来计算写入和读取的次数,但这感觉就像黑客。有更好的办法吗?

最佳答案

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/

相关文章:

c# - 企业库日志记录 - 如何在运行时获取配置的日志记录级别?

c# - 检查重复项时的性能

macos - 编写适用于 OSX 和 Windows(dotnet 核心)的文件路径

c# - WCF如何创建连接到同一个服务实例的两个 channel

go - 方法调用与 channel 的使用

c# - 是否可以在不进行子类化的情况下扩展 DataGridView 控件?

c# - MediaTypeFormatter 序列化 web api 中的枚举字符串值

asp.net-mvc - 如何在 .NET Core 3.1 中使用 Azure AD Saml2 身份验证进行 SSO

c# - 异步函数返回异步元数据(包括结果)而不仅仅是结果

linux - Nagios 松弛 channel 集成