ConcurrentQueue со множеством постановок в очередь и одним удалением из очередиC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 ConcurrentQueue со множеством постановок в очередь и одним удалением из очереди

Сообщение Anonymous »

Я использую ConcurrentQueue. Мне нужно:
  • несколько потребителей для постановки элементов в очередь
  • один потребитель для исключения из очереди всех элементов за один раз
  • во время удаления из очереди, чтобы заблокировать очередь, чтобы другие потребители не могли одновременно поставить в очередь новые элементы.

Код: Выделить всё

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)
{
// ...
}

}
Я не понимаю, какой инструмент параллелизма лучше всего подходит для синхронизации доступа к _queue (в Enqueue и Flush).
Должен ли я использовать простую блокировку или что-то более экзотическое?
ОБНОВЛЕНИЕ: чтобы ответить на комментарии ниже, я не привязан к ConcurrentQueue; если есть более подходящий одновременный сбор, сообщите мне.

Подробнее здесь: https://stackoverflow.com/questions/792 ... e-dequeuer
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»