У меня есть требование сделать процесс масштабируемым. В процессе в основном выполняются операции ввода-вывода с некоторыми второстепенными операциями ЦП (в основном десериализация строк). Процесс запрашивает в базе данных список URL-адресов, затем извлекает данные из этих URL-адресов, десериализует загруженные данные в объекты, затем сохраняет некоторые данные в динамике crm, а также в другой базе данных. После этого мне нужно обновить первую базу данных, URL-адреса которой были обработаны. Частично требование - сделать степень параллелизма настраиваемой.
Изначально я думал реализовать это через последовательность задач с ожиданием и ограничить параллелизм с помощью семафора - довольно просто. Затем я прочитал здесь несколько сообщений и ответов @Stephen Cleary, который рекомендует использовать TPL Dataflow, и я подумал, что это может быть хорошим кандидатом. Однако я хочу быть уверенным, что «усложняю» код, используя Dataflow по уважительной причине. Я также получил предложение использовать метод расширения ForEachAsync, который также прост в использовании, однако я не уверен, не вызовет ли он накладных расходов памяти из-за того, как он разбивает коллекцию на разделы.
Подходит ли TPL Dataflow для такого сценария? Чем он лучше, чем метод Semaphore или ForEachAsync - какие преимущества я получу, если реализую его через TPL DataFlow по сравнению с другими вариантами (Semaphore / ForEachASync)?
ActionBlock
сMaxDegreeOfParallelism
в качестве настраиваемого. Насколько я понимаю, TPL эффективно управляет пулом потоков, но есть некоторые другие проблемы. Я хочу, чтобы это было просто, просто ограничьте количество задач, выполняемых одновременно, вы тоже этим занимаетесь? - person Polynomial Proton   schedule 31.07.2018TPL Dataflow is great, especially if you're looking to limit work in one part of a larger pipeline
Однако, если дросселируемое действие нужно выполнить только один раз, то семафора достаточно. - person Polynomial Proton   schedule 31.07.2018