- несколько потребителей для постановки элементов в очередь
- один потребитель для исключения из очереди всех элементов за один раз
- во время удаления из очереди, чтобы заблокировать очередь, чтобы другие потребители не могли одновременно поставить в очередь новые элементы.
Код: Выделить всё
public class Cache
{
private readonly ConcurrentQueue _queue = new();
public void Enqueue(Item item) // what synchronisation to perform here?
{
ArgumentNullException.ThrowIfNull(item, nameof(item));
_queue.Enqueue(item);
}
public void Flush() // what synchronisation to perform here?
{
// dequeue all items
var items = new List();
while (_queue.TryDequeue(out var item))
items.Add(item);
// `DoSomething` could take time; therefore above we
// dequeued and cached all items, so other consumers
// can immediately continue enqueuing
foreach (var item in items)
DoSomething(item);
}
public void DoSomething(Item item)
{
// ...
}
}
Должен ли я использовать простую блокировку или что-то более экзотическое?
ОБНОВЛЕНИЕ: чтобы ответить на комментарии ниже, я не привязан к ConcurrentQueue; если есть более подходящий одновременный сбор, сообщите мне.
Подробнее здесь: https://stackoverflow.com/questions/792 ... e-dequeuer