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 : 2970
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...

{JAVA / J2EE} FENÊTRE BLOQUANTE
Pour créer une fenêtre d'information avec Swing, tout le monde connait JOptionPane. Cette classe per...

{JAVA / J2EE} JNI: THREAD NATIF & CONTEXTE JAVA
ATTENTION: Avant toute chose, ce code contient plus de code natif que de code java donc si le C vous...

{Visual Basic, VB6, VB.NET, VB 2005} CREER UN GIF ANIMÉ
Ce programme crée un gif animé grâce à la librairie Gif.Components.DLL. Son utilisation est très si...

{C# / C#.NET} AFFICHAGE DE VALEUR PROVENANT D'U THREAD DANS UN FORMULAIRE
Développer sous VS2010 Framework 4.0 Le but cette source est de montrer comment gérer les événem...

{JAVA / J2EE} SERVEUR D'OBJET ET EXEMPLE D UTILISATION : SERVER CHAT ET SON CLIENT
En fait je n ai pas trouver de client/serveur me convenant sur le site ;o) donc j ai fait le mien ;o...

{JAVA / J2EE} MINI SEVEUR HTTP AVEC INTERFACE GRAPHIQUE ET IMPLÉMENTATIONS DES MÉTHODES GET, PUT, HEAD ET DELETE
Le serveur fonctionne sur deux modes soit en MultiThread, Soit en Canaux. De plus, vous pouvez chang...

{Python} SOCKET MULTITHREAD SIMPLE
Voici la base pour créer des sockets multi-clients. Je n'est pas trouvé de source qui proposé dR...

{C / C++ / C++.NET} SOKOBAN EN C POUR DÉBUTANT (VERSION AMÉLIORÉE BASÉE SUR LE TUTORIEL DU SITE DU ZÉRO)
Bonjour, je vous propose ma première source en C. Je débute et me suis basé sur le tutoriel début...