Я использую ConcurrentQueue
для постановки в очередь элементов из связанной задачи ввода-вывода и удаления их из другой для обработки.Я прекращаю добавлять элементы в очередь, когда она достигает определенного размера, чтобы обработка могла наверстать упущенное.Для этого я проверяю свойство ConcurrentQueue.Count
.
Проблема в том, что свойство Count
не работает так, как в Списке или других коллекциях.Это чрезвычайно медленно, и чем больше очередь, тем медленнее требуется чтение свойства Count
.С 20 тыс. Элементов в 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?