
[英]Why does calling IEnumerable<string>.Count() create an additional assembly dependency?
[英]Does BoundedChannelFullMode count as additional readers?
在System.Threading.Channels
中,有一个ChannelOptions.SingleReader
属性,如果一次只能发出一个读取,它会选择一个优化的实现。
ChannelOptions
由具有FullMode
属性的BoundedChannelOptions
继承。
两个FullMode
值能够从 Channel 的内部存储/队列中删除项目:
BoundedChannelFullMode.DropNewest
删除并忽略频道中的最新项目,以便为正在写入的项目腾出空间。
BoundedChannelFullMode.DropOldest
删除并忽略通道中最旧的项目,以便为正在写入的项目腾出空间。
出于SingleReader
属性的目的,在写入过程中删除最新/最旧的项目是否算作读取器?
(这不会使这两个值与SingleReader = true
互斥,但这意味着当组合使用时,不仅两个读取不能相互重叠,而且读取也不能与写入重叠。)
使用SingleWriter
和SingleReader
选项配置有界通道仅具有装饰效果。 目前(.NET 7)只有一个有界Channel<T>
实现,它支持多个编写器和读取器。 此实现基于与lock
同步的Deque<T>
(类似于Queue<T>
的内部 .NET 类型)。 您可以将SingleWriter
/ SingleReader
选项设置为值的任意组合,这绝对没有区别。 SingleReader
选项仅对无界通道有效,而SingleWriter
对任何地方都没有任何影响。
那么在写入期间发生的最新/最旧项目的删除是否算作读者? 文档没有明确指定。 Channels 库的文档总体上有些缺乏。 我的意见是,它不应该算作读者。 在一个写作和阅读的角色被如此小心分离的机制中,如果一个简单的写作行为实际上是写作+阅读的混合体,那将是非常令人惊讶的。 但是由于SingleWriter
/ SingleReader
选项对有界通道没有影响,因此目前对此的争论是学术性的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.