La gestion de l'exécution simultanée de nombreuses opérations asynchrones nécessite souvent une limitation des tâches. Le flux de données de la bibliothèque parallèle de tâches (TPL) fournit une solution élégante à ce défi commun.
TPL Dataflow TransformBlock<TInput, TOutput>
offre un mécanisme robuste pour contrôler le niveau maximum d'exécution de tâches parallèles. Cela vous permet de traiter efficacement les flux de données (comme les URL) et de collecter les résultats une fois le traitement terminé.
Voici un exemple de mise en œuvre pratique :
<code class="language-csharp">var downloader = new TransformBlock<string, HttpResponse>( url => Download(url), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 50 } ); var buffer = new BufferBlock<HttpResponse>(); downloader.LinkTo(buffer); foreach (var url in urls) downloader.Post(url); //or await downloader.SendAsync(url); downloader.Complete(); await downloader.Completion; IList<HttpResponse> responses; if (buffer.TryReceiveAll(out responses)) { //process responses }</code>
Ce code crée un TransformBlock
(nommé downloader
) limitant les téléchargements simultanés à 50. Le downloader
est lié à un BufferBlock
(buffer
) pour contenir les objets HttpResponse
. Après avoir soumis toutes les URL, nous signalons la fin et attendons la fin du downloader
. Enfin, les réponses collectées sont récupérées depuis le buffer
.
TPL Dataflow offre des avantages significatifs par rapport aux méthodes de limitation manuelle :
Il est crucial de noter que TransformBlock
met en mémoire tampon les entrées et les sorties. Pour éviter les blocages potentiels, il est recommandé de le lier à un BufferBlock
distinct, comme indiqué ci-dessus, et de récupérer les résultats une fois terminé.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!