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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Tutoriel pour apprendre à programmer avec les pools de threads en C# [Tutoriel]


Sujet :

C#

  1. #21
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 695
    Points
    10 695
    Billets dans le blog
    21
    Par défaut
    Bonjour à toutes et à tous,

    Je vous propose le troisième 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/part3/

    Au programme, l'utilisation des mots-clés async et await.

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

    Retrouvez les meilleurs et tutoriels pour apprendre la programmation C#
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  2. #22
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Hello

    Tu peux préciser ce que tu veux dire ici : "Avec la plateforme .Net, la programmation asynchrone est généralement multitâche, et lorsque c'est le cas, utilise des threads… du pool de threads !" ?
    Car par défaut, async/await ne crée pas de nouveaux threads


  3. #23
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 695
    Points
    10 695
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Ce que je veux dire, c'est qu'hormis dans un contexte particulier (par exemple, thread graphique), c'est la configuration par défaut qui est utilisée. Cette configuration utilise le pool de threads, c'est-à-dire que async/await ne créé par directement de nouveau thread, mais demande un thread au pool de threads. Si le pool de threads ne dispose pas de thread disponible, et si la limite max de threads n'est pas atteinte, alors dans ce cas un thread est créé. Mais uniquement dans ce cas. Dans le cas contraire, la tâche est simplement mise en attente.

    Maintenant, tu as raison puisqu'en général, async/await ne créé pas de thread, car réutilise un thread déjà existant.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  4. #24
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Hmmm, je ne suis pas d'accord.
    Pour moi, le await/async ne fait que "libérer" le thread courant pour faire autre chose et l'async est géré sur ce même thread lors du "call back"

  5. #25
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 695
    Points
    10 695
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par lutecefalco Voir le message
    Pour moi, le await/async ne fait que "libérer" le thread courant pour faire autre chose et l'async est géré sur ce même thread lors du "call back"
    C'est exact lorsque l'appel à lieu dans le thread graphique. Mais hors thread graphique, le pool de threads est bel et bien utilisé.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  6. #26
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 695
    Points
    10 695
    Billets dans le blog
    21
    Par défaut
    Pour t'en convaincre, voici un petit programme a exécuté en mode console :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
     
    namespace AsyncAwaitTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Thread ID dans le programme principal : {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);
                Task task = TestTaskAsync();
                task.Wait();
                Console.Write("Fin du programme");
                Console.ReadLine();
            }
     
            static async Task TestTaskAsync()
            {
                await Task.Run(() =>
                {
                    Console.WriteLine("Thread ID de la tâche : {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);
                });
            }
        }
    }

    Tu pourras constater que l'ID du thread principal est différent de l'ID du thread exécutant la tâche.

    Exécuter cet exemple depuis le thread graphique (en le modifiant légèrement, pour faire en sorte que le code contenu dans le Main soit appelé suite à un clic sur un bouton par exemple) va même provoquer un interblocage (car le task.Wait va mettre en attente le thread graphique, qui de se fait ne pourra pas exécuter la tâche, et donc attendra indéfiniment).
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  7. #27
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Ouais mais là tu triches en passant par Task.Run
    Si tu reprends ton exemple de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    static void Main(string[] args)        {
                Console.WriteLine(DateTime.Now.ToString("HH:mm.ss"));
                var t = Async3Times();
                t.Wait();
     
     
                Console.WriteLine(DateTime.Now.ToString("HH:mm.ss"));
                Console.ReadLine();
            }
     
    private async static Task Async3Times()
            {
                await HelloWorldAsync();
                await HelloWorldAsync();
                await HelloWorldAsync();
            }
    Là on attend 12 secondes.
    S'il y avait eu création de threads différents et donc exécution en parallèle, ça aurait pris 4 secondes.
    Ou alors j'ai zappé un truc, c'est pas trop mon domaine ça

  8. #28
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 695
    Points
    10 695
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par lutecefalco Voir le message
    Ouais mais là tu triches en passant par Task.Run
    Aucune tricherie. Où il faut que tu m'expliques pourquoi. await attend une instance de Task. Je lui en fournie une.

    Citation Envoyé par lutecefalco Voir le message
    Si tu reprends ton exemple de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    static void Main(string[] args)        {
                Console.WriteLine(DateTime.Now.ToString("HH:mm.ss"));
                var t = Async3Times();
                t.Wait();
     
     
                Console.WriteLine(DateTime.Now.ToString("HH:mm.ss"));
                Console.ReadLine();
            }
     
    private async static Task Async3Times()
            {
                await HelloWorldAsync();
                await HelloWorldAsync();
                await HelloWorldAsync();
            }
    Là on attend 12 secondes.
    S'il y avait eu création de threads différents et donc exécution en parallèle, ça aurait pris 4 secondes.
    Ou alors j'ai zappé un truc, c'est pas trop mon domaine ça
    Tu as effectivement zappé un truc. Que ton programme s'exécute parallèlement ou séquentiellement n'a aucune incidence ici. Pourquoi ? Car ta méthode Async3Times n'appelle pas 3 fois HelloWordAsync de manière parallèle mais de manière séquentielle. Il l'appelle une première fois et attend la fin de son exécution. Puis, l'appelle une seconde fois et attend la fin de son exécution, avant de l'appeler une troisième fois et d'attendre la fin de son exécution.

    Ce qui s'exécute en parallèle dans ton code, c'est la méthode Async3Times qui s'exécute en parallèle de la méthode Main, et l'exécution des méthodes HelloWorldAsync qui s'exécute également sur un autre thread (qui potentiellement peut être le même que celui exécutant Async3Times car lorsque Async3Times est en attente sur un await, il libère le thread l'exécutant).

    Le point important, c'est que lorsqu'une tâche est en attente d'une autre sur un await, elle libère le thread exécutant la tâche, au lieu de le bloquer comme le font les méthodes classiques. Pourquoi est-ce important ? Une des raisons justifiant l'introduction de ce concept async/await est de permettre l'écriture quasiment sans modification (juste le mot clé await à rajouter !), dans le thread graphique, de méthodes longues (attendant une communication réseau par exemple) qui ne bloquent pas l'interface graphique.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  9. #29
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Oui donc on a du multi tâches grâce aux tasks, et non via await / async

  10. #30
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 695
    Points
    10 695
    Billets dans le blog
    21
    Par défaut
    J'ai envie de dire oui, mais je ne suis pas sûr que tu aies bien compris pourquoi. async/await ne travaille que sur des instances de Task. Donc, là où tu as async/await, tu as forcément des tâches. Async/await est "juste" un sucre syntaxique pour faciliter la gestion de ces tâches (je mets juste entre guillemets car le code généré est sacrément compliqué).

    Citation Envoyé par François DORIN
    Ce qui s'exécute en parallèle dans ton code, c'est la méthode Async3Times qui s'exécute en parallèle de la méthode Main, et l'exécution des méthodes HelloWorldAsync qui s'exécute également sur un autre thread (qui potentiellement peut être le même que celui exécutant Async3Times car lorsque Async3Times est en attente sur un await, il libère le thread l'exécutant).
    Je viens de voir que j'ai fais une erreur en disant cela (qui explique peut-être ton incompréhension).
    Lorsque le code que tu as donné en exemple appelle la méthode Async3Times, la méthode s'exécute d'abord, non pas sur un thread différent, mais sur le thread courant. Arrivé au premier await, la fonction retourne une valeur (une instance de Task) et l'exécution du programme principal continue.

    Ensuite, une fois que la tâche attendue par le await a terminé son exécution, la méthode Async3Times continue son exécution, mais sur un thread différent du thread principal (et donc l'async n'est pas géré sur le même thread lors du "call back" comme tu pouvais l'écrire plus haut, mais l'est pour la portion de code situé avant le premier await (bon, ici, il n'y en a pas) )
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  11. #31
    tlt
    tlt est déconnecté
    Membre averti Avatar de tlt
    Homme Profil pro
    Programmeur
    Inscrit en
    Juillet 2004
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Programmeur
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 202
    Points : 412
    Points
    412
    Par défaut
    Bonjour.
    Juste une remarque: Il y a un problème avec le lien pdf du tuto.

  12. #32
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 695
    Points
    10 695
    Billets dans le blog
    21
    Par défaut
    Merci. C'est corrigé.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  13. #33
    Membre chevronné
    Avatar de stailer
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mars 2003
    Messages
    1 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 136
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    3
    Par défaut
    Merci pour cet article,

    En faisant des tests sur ma classe qui gère une suite de tâche je me suis aperçu que dans certains contextes mon application (une Winform et une autre Wpf) pouvait bloquer en attendant la fin.
    J'ai donc pu modifier et corriger le problème.

    Cet article est très concret sans blabla théorique inutile. Beau travail.
    .o0o__St@iLeR__oOo.

    Lead Developer

    ASP.NET MVC - MCP/MCSD ASP.NET
    PHP Zend Framework / PhalconPHP
    Cordova/Xamarin IOS/Android
    Kendo UI - ExtJS - JQwidgets
    SQL Server / MySQL

  14. #34
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 695
    Points
    10 695
    Billets dans le blog
    21
    Par défaut
    Merci pour ce retour. Cela fait toujours plaisir à lire
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  15. #35
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 695
    Points
    10 695
    Billets dans le blog
    21
    Par défaut
    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#
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  16. #36
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,

    Très bon tutoriel et comme à chaque fois, clair et précis. On sent la maîtrise du sujet...

  17. #37
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 695
    Points
    10 695
    Billets dans le blog
    21
    Par défaut
    Merci
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  18. #38
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    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 - Visualiser dans une fenêtre à part
    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 - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     ThreadQueue.QueueUserWorkItem(ThreadProc);
     ThreadQueue.QueueUserWorkItem(ThreadProc2);
     ThreadQueue.QueueUserWorkItem(ThreadProc3);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.");
            }
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  19. #39
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 695
    Points
    10 695
    Billets dans le blog
    21
    Par défaut
    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 - Visualiser dans une fenêtre à part
    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.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

Discussions similaires

  1. Premier programme avec les tableaux
    Par Panaméen dans le forum Débuter
    Réponses: 3
    Dernier message: 02/11/2007, 10h41
  2. Tutoriel sur les pool de threads
    Par ploxien dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 09/08/2007, 13h14
  3. [Debutant] Programme avec les fonctions
    Par Tilk*sg1 dans le forum Débuter
    Réponses: 5
    Dernier message: 06/11/2006, 10h03
  4. Programmation avec les MFC
    Par ksoft dans le forum MFC
    Réponses: 3
    Dernier message: 04/05/2006, 21h50
  5. Réponses: 4
    Dernier message: 15/03/2006, 09h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo