Fluxo de dados TPL x semáforo simples

Eu tenho um requisito para fazer um processo escalável. O processo possui principalmente operações de E / S com algumas operações menores da CPU (principalmente desserializando cadeias). O processo consulta o banco de dados em busca de uma lista de URLs, depois busca dados desses URLs, desseriliza os dados baixados em objetos e, em seguida, persiste alguns deles na dinâmica de CRM e também em outro banco de dados. Depois, preciso atualizar o primeiro banco de dados cujos URLs foram processados. Parte do requisito é tornar o grau de paralelismo configurável.

Inicialmente, pensei em implementá-lo através de uma sequência de tarefas com aguardar e limitar o paralelismo usando o Semaphore - bastante simples. Depois, li alguns posts e respostas aqui de Stephen Cleary, que recomenda o uso do TPL Dataflow e achei que poderia ser um bom candidato. No entanto, quero ter certeza de que estou "complicando" o código usando o Dataflow por uma causa válida. Também recebi uma sugestão para usar umMétodo de extensão ForEachAsync que também é simples de usar, no entanto, não tenho certeza se isso não causará sobrecarga de memória devido à maneira como particiona a coleção.

O TPL Dataflow é uma boa opção para esse cenário? Como é melhor que um método Semáforo ou ForEachAsync - que benefícios obterei se implementá-lo via TPL DataFlow sobre cada uma das outras opções (Semaphore / ForEachASync)?

questionAnswers(1)

yourAnswerToTheQuestion