Après la sortie de la .NET 6 (en novembre 2021), le moyen recommandé pour limiter le nombre d'opérations d'E/S asynchrones simultanées est la fonction Parallel.ForEachAsync
avec l'API MaxDegreeOfParallelism
configuration. Voici comment l'utiliser en pratique :
// let's say there is a list of 1000+ URLs
string[] urls = { "http://google.com", "http://yahoo.com", /*...*/ };
var client = new HttpClient();
var options = new ParallelOptions() { MaxDegreeOfParallelism = 20 };
// now let's send HTTP requests to each of these URLs in parallel
await Parallel.ForEachAsync(urls, options, async (url, cancellationToken) =>
{
var html = await client.GetStringAsync(url, cancellationToken);
});
Dans l'exemple ci-dessus, le Parallel.ForEachAsync
est attendue de manière asynchrone. Vous pouvez également Wait
de manière synchrone si nécessaire, ce qui bloquera le thread actuel jusqu'à la fin de toutes les opérations asynchrones. Le processus synchrone Wait
a l'avantage qu'en cas d'erreurs, toutes les exceptions seront propagées. Au contraire, le await
ne propage, par conception, que la première exception. Si cela pose un problème, vous pouvez trouver des solutions aquí .
(Remarque : une mise en œuvre idiomatique d'une <code>ForEachAsync</code> qui propage également les résultats, peut être trouvée dans le fichier <a href="https://stackoverflow.com/revisions/64455549/4">4ème révision </a>de cette réponse)