Utilisez TPL Dataflow pour limiter le nombre de tâches asynchrones simultanées
Cet article explique comment utiliser TPL Dataflow pour limiter efficacement le nombre de tâches asynchrones simultanées tout en tirant pleinement parti du multi-threading. Par rapport à l'approche BlockingCollection
utilisant SemaphoreSlim
et ThrottleTasksAsync
, TPL Dataflow fournit une solution plus propre.
En configurant l'attribut TransformBlock
de MaxDegreeOfParallelism
, nous pouvons directement spécifier le nombre maximum de tâches exécutées simultanément. Ajoutez des URL à TransformBlock
et il les gérera de manière asynchrone. Une fois le traitement terminé, les résultats sont disponibles.
<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); downloader.Complete(); await downloader.Completion; IList<HttpResponse> responses; if (buffer.TryReceiveAll(out responses)) { // 处理结果 }</code>
Il convient de noter que TransformBlock
met en mémoire tampon les entrées et les sorties. Par conséquent, nous le connectons à BufferBlock
pour empêcher TransformBlock
de se bloquer jusqu'à ce que tous les éléments de sortie soient consommés. La méthode BufferBlock.TryReceiveAll
est utilisée pour récupérer tous les résultats une fois TransformBlock
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!