我有一个UnboundedChannel
单读取器\多个写入器,我希望能够使用Count
属性,但是由于CanCount
属性总是false,所以Count
会抛出一个异常。我应该怎么做才能使它工作,我找不到任何限制登记在文档中。
发布于 2021-12-17 03:54:14
当UnboundedChannelOptions.SingleReader
属性在创建时设置为true
时,UnboundedChannel
实现是SingleConsumerUnboundedChannel
。根据来源,该类使用的Reader
对象扩展ChannelReader
,而不显式设置CanCount
,默认情况下,ChannelReader
将CanCount
设置为false
。
不幸的是,所有这些类都是密封的,所以您不能仅仅扩展它们并自己实现Count
。将SingleReader
选项保留为false
将使用UnboundedChannelReader
实现,该实现将CanCount
设置为true
并实现Count
方法。如果您只需要检查队列中是否有更多的元素,也可以使用TryPeek
。
发布于 2021-12-17 10:20:48
所有有界信道实现都支持读取Count
,因此,如果您需要一个SingleReader
和Count
-enabled无界通道,您只需使用配置了最大容量的有界通道。实际上,它将是无限的。
var channel = Channel.CreateBounded<int>(
new BoundedChannelOptions(Int32.MaxValue) { SingleReader = true });
Console.WriteLine(channel.Reader.CanCount); // True
更新:当前只有一个有限制的通道实现,即BoundedChannel
(内部密封类),它忽略了SingleReader
设置。换句话说,无论要使用多少读取器,您都会得到相同的实现。这有点令人失望,因为它表明,丰富的可用选项集并不对应于同样丰富的实现集。基本上,在.NET 6中只有三个实现可用,即UnboundedChannel<T>
、SingleConsumerUnboundedChannel<T>
和BoundedChannel<T>
。
https://stackoverflow.com/questions/70375696
复制相似问题