У меня есть 1000 элементов в блоке потока данных TPL, каждый элемент будет вызывать внешние веб-сервисы.
веб-сервис поддерживает максимум 10 одновременных вызовов, что легко достигается с помощью:
new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = 10
...
}
Веб-служба требует, чтобы каждому вызову был передан уникальный идентификатор, который отличает его от других одновременных вызовов. Теоретически это должен быть guid, но на практике 11-й GUID даст сбой, потому что механизм дросселирования на сервере медленно распознает завершение первого вызова.
Поставщик предлагает переработать направляющие, оставив 10 активно используемых.
Я намерен иметь массив GUIDS, каждая задача будет использовать (Interlocked.Increment(ref COUNTER) % 10) в качестве индекса массива
EDIT: я только что понял, что это не сработает! Предполагается, что задачи будут выполняться в том порядке, в котором они могут не выполняться. Я мог бы реализовать это как очередь идентификаторов, где каждая задача заимствует и возвращает один, но вопрос остается в силе, есть ли более простой, предварительно встроенный потокобезопасный способ сделать это?
(для переполнения счетчика COUNTER никогда не будет достаточно вызовов)
Но меня несколько раз удивлял С# (я новичок в .net), что я реализую то, что уже существует.
Есть ли лучший потокобезопасный способ повторного использования каждой задачи из пула идентификаторов?