У меня есть такая настройка BufferBlock.
_inputQueue = new BufferBlock<WorkItem>(new DataflowBlockOptions
{
BoundedCapacity = 1,
CancellationToken = cancellationToken,
EnsureOrdered = true
});
Наличие нескольких потребителей, вызывающих функцию "FetchWork" из отдельных потоков
public async Task<WorkItem> GetWork()
{
WorkItem wi;
try
{
wi = await _inputQueue.ReceiveAsync(new TimeSpan(0, 0, 1));
}
catch (Exception)
{
//since we supplied a timeout, this will be thrown if no items come back
return null;
}
return wi;
}
Иногда один и тот же рабочий элемент заканчивается в несколькихпотребители!Чем больше количество рабочих элементов в «InputQueue», тем больше шансов получить дубликаты в GetWork. Насколько я понимаю, элементы, извлекаемые с помощью ReceiveAsync, являются атомарными, и как только элемент будет прочитан, он не будет прочитан снова. Здесь этого не происходит.40 параллельных потребителей звонят в GetWork.