Используя второй пример из Microsoft Docs , когда у меня есть неблокирующий потребитель, какой предпочтительный подход заставляет потребителя ждать, когда в BlockingCollection
нет элементов? Пример из документов выглядит следующим образом.
static void NonBlockingConsumer(BlockingCollection<int> bc, CancellationToken ct)
{
// IsCompleted == (IsAddingCompleted && Count == 0)
while (!bc.IsCompleted)
{
int nextItem = 0;
try
{
if (!bc.TryTake(out nextItem, 0, ct))
{
Console.WriteLine(" Take Blocked");
}
else
Console.WriteLine(" Take:{0}", nextItem);
}
catch (OperationCanceledException)
{
Console.WriteLine("Taking canceled.");
break;
}
// Slow down consumer just a little to cause
// collection to fill up faster, and lead to "AddBlocked"
Thread.SpinWait(500000);
}
Console.WriteLine("\r\nNo more items to take.");
}
В приведенном выше примере используется SpinWait
для приостановки работы потребителя.
Простое использование следующего, вероятно, будет сильно загружать процессор.
if (!bc.TryTake(out var item))
{
continue;
}
Какой предпочтительный подход здесь, чтобы заставить потребителя ждать? Я планирую использовать несколько BlockingCollection
и ищу наиболее оптимальный способ его использования.