Vous pouvez certainement le faire dans les dernières versions d'async pour .NET, en utilisant .NET 4.5 Beta. L'article précédent de 'usr' renvoie à un bon article écrit par Stephen Toub, mais la nouvelle moins annoncée est que le sémaphore asynchrone a été intégré à la version bêta de .NET 4.5.
Si vous regardez notre bien-aimé SemaphoreSlim
(que vous devriez utiliser car elle est plus performante que la classe originale Semaphore
), il peut désormais se targuer d'être le WaitAsync(...)
une série de surcharges, avec tous les arguments attendus - intervalles de temps, jetons d'annulation, tous vos amis habituels de la planification :)
Stephen a également écrit un article de blog plus récent sur les nouvelles fonctionnalités de .NET 4.5 qui sont apparues avec la version bêta. Nouveautés pour Parallelism in .NET 4.5 Beta .
Enfin, voici un exemple de code sur l'utilisation de SemaphoreSlim pour la limitation des méthodes asynchrones :
public async Task MyOuterMethod()
{
// let's say there is a list of 1000+ URLs
var urls = { "http://google.com", "http://yahoo.com", ... };
// now let's send HTTP requests to each of these URLs in parallel
var allTasks = new List<Task>();
var throttler = new SemaphoreSlim(initialCount: 20);
foreach (var url in urls)
{
// do an async wait until we can schedule again
await throttler.WaitAsync();
// using Task.Run(...) to run the lambda in its own parallel
// flow on the threadpool
allTasks.Add(
Task.Run(async () =>
{
try
{
var client = new HttpClient();
var html = await client.GetStringAsync(url);
}
finally
{
throttler.Release();
}
}));
}
// won't get here until all urls have been put into tasks
await Task.WhenAll(allTasks);
// won't get here until all tasks have completed in some way
// (either success or exception)
}
Enfin, une solution qui utilise l'ordonnancement basé sur le TPL mérite d'être mentionnée. Vous pouvez créer des tâches liées à un délégué sur le TPL qui n'ont pas encore été lancées, et permettre à un planificateur de tâches personnalisé de limiter la concurrence. En fait, il y a un exemple MSDN pour cela ici :
Voir aussi TaskScheduler .