Les Snippets

Connexion

EachParallel

Niveau requis pour utiliser/comprendre cette source : 2 ( Initié )
Créé le 03/10/2009 19:13:23 et initié par SoaR245 [Liste]
Vue : 584
Catégorie(s) : Trucs & Astuces, Algorithme
Langages dispo pour ce code :
- C# 3.x



Langage : C# 3.x
Date ajout : 03/10/2009
Posté par SoaR245 [Liste]
    

{

        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);

            }

        }

    }


Snippets en rapport avec : Thread, Parallelextension, Foreach, Méthode extension



Codes sources en rapport avec : Thread, Parallelextension, Foreach, Méthode extension

{C# / C#.NET} EACHPARALLEL
En attendant la version 4 du Framework et l’arrivée des ParallelExtensions, voici une méthode ...

{C# / C#.NET} TRAITER UN FOREACH EN PARALLÈLE
Faire des boucles ForEach, c'est pratique. Mais si on a beaucoup d'éléments à traiter, pourquoi ne p...

{Delphi} SYNCHRONISATION DE THREADS DANS DES DLL
Bonjour, Voici une petite unité qui peut s'averer tres pratique lorsque l'on a besoin de creer de...

{C / C++ / C++.NET} [C++] CLASS REGISTER
Permet de garder une trace de toutes les classes crees. J'ai fais ce code a la base car j'utili...

{Visual Basic, VB6, VB.NET, VB 2005} MULTI THREAD AVEC AFFICHAGE
J'ai développé cette source afin de faire du multi-thread et d'afficher des données à partir de chac...

{Python} TK_WATCH :HORLOGE GRAPHIQUE
Salut c'est un exercice Graphique/Thread que j'ai fait lorsque j'apprenait à manier le Python depuis...

{C# / C#.NET} CALCUL D'EMPREINTES DE FICHIERS
Cette petite source simple permet de calculer les empreintes (hash) MD5, RIPEMD160, SHA-1, SHA-256, ...

{C# / C#.NET} SODOKU MUSING (PERMUTATION & SODOKU)
Une application WPF représentant un Sodoku. Elle permet de manipuler un Sodoku en permutant ses lig...

{JAVA / J2EE} SERVEUR ACCESS
un serveur de base de données pour access, simple et utile pour toute application fonctionnant en ré...

{Delphi} THREAD ET BITMAP (DESSIN AU CRAYON)
Suite à un échange sur le forum, je met en ligne un petit programme qui traite une image avec une so...