En attendant la version 4 du Framework et l’arrivée des ParallelExtensions, voici une méthode d’extension vous offrant la possibilité de parcourir les éléments d’une liste en parallèle et d’effectuer un traitement sur chaque élément.
Source / Exemple :
public static class ParallelProcessor
{
public static void EachParallel<T>(this IEnumerable<T> list, Action<T> action)
{
int count = list.Count();
if (count == 0)
return;
else if (count == 1)
{
// Si un seul élément est présent, on l'exécute directement sans
// risquer de perde du temps pour la création des threads si aucun
// n'est disponible dans le pool
action(list.First());
}
else
{
// La méthode WaitHandle.WaitAll peut gérer au maximum 64 threads
int maxWaitHandler = count > 64 ? 64 : count;
// Initialisation des reset events pour connaitre les états
ManualResetEvent[] resetEvents = new ManualResetEvent[maxWaitHandler];
// On parcours la liste des éléments pour effectuer l'action sur
// chacun
int i = 0;
foreach (T item in list)
{
int index = i;
T itemCourant = item;
if (i >= maxWaitHandler)
// Si on dépasse la capacité maximum, on attends la libération
// d'une place
index = WaitHandle.WaitAny(resetEvents);
resetEvents[index] = new ManualResetEvent(false);
// Exécution du traitement
ThreadPool.QueueUserWorkItem(new WaitCallback((object data) =>
{
// Execution de la méthode
action(itemCourant);
// On informe que le traitement est terminé
resetEvents[index].Set();
}));
i++;
}
// On attend que tous les threads aient terminés
WaitHandle.WaitAll(resetEvents);
}
}
}
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.