Maison >développement back-end >C++ >Comment le flux de données TPL peut-il limiter les tâches asynchrones simultanées ?

Comment le flux de données TPL peut-il limiter les tâches asynchrones simultanées ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-22 20:22:12595parcourir

How Can TPL Dataflow Limit Concurrent Asynchronous Tasks?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn