Maison > développement back-end > C++ > Comment puis-je limiter les tâches asynchrones en C# ?

Comment puis-je limiter les tâches asynchrones en C# ?

Susan Sarandon
Libérer: 2025-01-22 20:26:10
original
967 Les gens l'ont consulté

How Can I Throttle Asynchronous Tasks in C#?

Limiter les tâches asynchrones

Dans la programmation asynchrone, il est souvent nécessaire de limiter le nombre de tâches simultanées pouvant être exécutées à un moment donné pour obtenir une limitation. Ceci est particulièrement utile lors de plusieurs appels d’API ou du traitement de grands ensembles de données.

Méthode ThrottleTasksAsync

La méthode d'extension ThrottleTasksAsync fournie résout cette situation. Il accepte une énumération de projets, un nombre maximum de tâches simultanées et une fonction de création de tâches. Il utilise BlockingCollection et SemaphoreSlim pour appliquer la limitation.

<code class="language-c#">public static async Task<result_t> ThrottleTasksAsync<enumerable_t, result_t>(
    this IEnumerable<enumerable_t> enumerable,
    int maxConcurrentTasks,
    int maxDegreeOfParallelism,
    Func<enumerable_t, Task> taskToRun)
{
    // ...
}</code>
Copier après la connexion

Cette méthode exécute le throttle sur un thread séparé, en utilisant SemaphoreSlim pour contrôler le nombre de tâches simultanées. Il utilise également Parallel.ForEach pour réaliser la parallélisation, dans un degré de parallélisme spécifié.

Flux de données TPL comme alternative

Bien que la méthode ThrottleTasksAsync fournisse une solution, le flux de données TPL propose une approche plus élégante. Plus précisément, les classes TransformBlock peuvent être utilisées pour définir les limites maximales de parallélisme pour l'exécution des tâches.

<code class="language-c#">var downloader = new TransformBlock<string, HttpResponse>(
    url => Download(url),
    new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 50 });

var buffer = new BufferBlock<HttpResponse>();
downloader.LinkTo(buffer);</code>
Copier après la connexion

En liant un TransformBlock à un BufferBlock, l'achèvement du bloc n'est pas bloqué par la disponibilité du consommateur. Cela permet au fragment de tampon de collecter les objets HttpResponse lors de sa génération, et le programme peut attendre la fin du téléchargeur avant de traiter la réponse.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal