IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Apprendre à programmer avec les pools de threads en C# - Quatrième partie : réaliser des tâches périodiques
Un tutoriel de François Dorin

Le , par François DORIN

0PARTAGES

8  0 
Bonjour à toutes et à tous,

Je vous propose le quatrième et dernier tutoriel de la série pour apprendre l'utilisation du pool de threads en programmation C#. Vous pouvez le consulter à l'adresse suivante : http://fdorin.developpez.com/tutorie...eadpool/part4/

Au programme, la réalisation de tâches périodiques !

Bonne lecture, et n'hésitez pas à apporter vos commentaires

Retrouvez les meilleurs et tutoriels pour apprendre la programmation C#
Vous avez lu gratuitement 4 articles depuis plus d'un an.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de ebastien
Membre expérimenté https://www.developpez.com
Le 19/04/2017 à 15:28
Bonjour,

Très bon tutoriel et comme à chaque fois, clair et précis. On sent la maîtrise du sujet...
3  0 
Avatar de François DORIN
Expert éminent sénior https://www.developpez.com
Le 21/04/2017 à 12:36
Merci
0  0 
Avatar de ikeas
Membre expérimenté https://www.developpez.com
Le 29/12/2020 à 5:59
bonjour

j'avais besoin d'une queue de thread enfin d'exécuter des fonctions en queue (façon thread pour libérer le système)
je me doute qu'on aurait pu faire un thread qui exécute chaque fonctions les unes après les autres
ou utiliser une queue dans un thread, mais au final comme je trouve ce code plutôt simple

j'aimerais donc juste savoir si cette solution pourrait être judicieuse
voila mon code
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 public static class ThreadQueue
    {
        private static object mutex = new object();

        public static void QueueUserWorkItem(WaitCallback callBack)
        {
            WaitCallback cw = x =>
            {
                lock (mutex)
                {
                    callBack.Invoke(null);
                }
            };
            ThreadPool.QueueUserWorkItem(cw);
            Thread.Sleep(1);
        }       
    }
avec une utilisation suivante
Code : Sélectionner tout
1
2
3
4
 ThreadQueue.QueueUserWorkItem(ThreadProc);
 ThreadQueue.QueueUserWorkItem(ThreadProc2);
 ThreadQueue.QueueUserWorkItem(ThreadProc3);
et
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
static void ThreadProc(Object stateInfo)
        {
            Console.WriteLine("START 1");
            Thread.Sleep(3000);
            Console.WriteLine("END 1");
        }
        static void ThreadProc2(Object stateInfo)
        {
            Console.WriteLine("START 2.");
            Thread.Sleep(2000);
            Console.WriteLine("END 2.");
        }
        static void ThreadProc3(Object stateInfo)
        {
            Console.WriteLine("START 3.");
            Console.WriteLine("END 3.");
        }
0  0 
Avatar de François DORIN
Expert éminent sénior https://www.developpez.com
Le 29/12/2020 à 10:39
Oui cela devrait marcher (j'ai juste lu, je n'ai pas testé !).

Le mutex permet de s'assurer que les différentes tâches seront exécutées les unes après les autres, et non en même temps. La simplicité ici vient que la gestion du thread qui exécute les fonctions est totalement laissé au système. Pas besoin de le créer soit même.

S'il n'y a pas beaucoup de tâches en attente, c'est méthode est tout à fait acceptable. S'il y en a beaucoup, je recommande l'utilisation d'un sémaphore binaire (=mutex) avec usage de async/await au lieu de l'instruction lock. En effet, avec l'instruction lock, tu vas réquisitionner un thread du pool de thread. Avec async/await, tu vas dire le libérer le temps de l'attente. Pour 3 tâches en attente max, ce n'est pas un soucis. Pour 200, c'est une autre histoire.

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 public static class ThreadQueue
    {
        private static SemaphoreSlim mutex = new SemaphoreSlim (1, 1);
 
        public static void QueueUserWorkItem(WaitCallback callBack)
        {
            WaitCallback cw = x =>
            {
                await semaphoreSlim.WaitAsync(); // on attend de récupérer le mutex
                try
                {
                    callBack.Invoke(null);
                }
                finally
                {
                    semaphoreSlim.Release(); // on libère le mutex. Très important le bloc finally ici, car le mutex doit être libérer dans tous les cas, y compris quand il y a une exception dans le callBack !
                }
            };
            ThreadPool.QueueUserWorkItem(cw);
        }       
    }
Juste une remarque : je ne vois pas l'utilité du Thread.Sleep(1); dans la méthode QueueUserWorkItem.
0  0