我正在使用一个
问题在于,
粗略示例:
ConcurrentQueue
来从一个I/O绑定的任务中入队项目,并从另一个任务中出队以进行处理。当队列达到一定大小时,我停止向其添加项目,以便可以进行处理。为此,我检查了ConcurrentQueue.Count
属性。问题在于,
Count
属性似乎不像列表或其他集合中一样行为。它非常缓慢,而且队列越大,读取Count
属性所需的时间就越长。在一个包含20k个项目的ConcurrentQueue
中,几乎所有的处理器时间都花费在Count
属性上。粗略示例:
while (reader.Read())
{
if(Queue.Count >= MaxQueueSize)
{
//Wait
}
//Do Stuff
}
运行性能分析器时,所有时间都花费在System.Collections.Concurrent.CDSCollectionETWBCLProvicer.ctor()
上。
这似乎只发生在.NET Core 2上,在.NET 4.6.2中不会出现此问题。
在.Net Core中有没有解决这个问题的方法?
Count
需要访问所有项目吗? - Douglas GaskellBlockingCollection
,谢谢!以FIFO方式获取项目时,这不会对性能产生严重影响吗? - Douglas Gaskell