TPL BufferBlock.ReceiveAsync получает один и тот же элемент дважды - PullRequest
0 голосов
/ 15 марта 2019

У меня есть такая настройка 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.

1 Ответ

1 голос
/ 17 марта 2019

Это похоже на проблему с сервисной фабрикой.BufferBlock блокирует элемент только один раз.Производители [экземпляры службы с сохранением состояния сервисной фабрики с количеством разделов 5] получают один и тот же элемент дважды в разных разделах.Должен расследовать это.

...