+ Répondre à la discussion Actualité déjà publiée
Page 2 sur 2 PremièrePremière 12
  1. #21
    Rédacteur/Modérateur
    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : juillet 2016
    Messages : 1 157
    Points : 3 713
    Points
    3 713
    Billets dans le blog
    5

    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
    Inscrit en
    juillet 2005
    Messages
    5 051
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : juillet 2005
    Messages : 5 051
    Points : 7 726
    Points
    7 726

    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
    Rédacteur/Modérateur
    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : juillet 2016
    Messages : 1 157
    Points : 3 713
    Points
    3 713
    Billets dans le blog
    5

    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
    Inscrit en
    juillet 2005
    Messages
    5 051
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : juillet 2005
    Messages : 5 051
    Points : 7 726
    Points
    7 726

    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
    Rédacteur/Modérateur
    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : juillet 2016
    Messages : 1 157
    Points : 3 713
    Points
    3 713
    Billets dans le blog
    5

    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
    Rédacteur/Modérateur
    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : juillet 2016
    Messages : 1 157
    Points : 3 713
    Points
    3 713
    Billets dans le blog
    5

    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
    Inscrit en
    juillet 2005
    Messages
    5 051
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : juillet 2005
    Messages : 5 051
    Points : 7 726
    Points
    7 726

    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
    Rédacteur/Modérateur
    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : juillet 2016
    Messages : 1 157
    Points : 3 713
    Points
    3 713
    Billets dans le blog
    5

    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
    Inscrit en
    juillet 2005
    Messages
    5 051
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : juillet 2005
    Messages : 5 051
    Points : 7 726
    Points
    7 726

    Par défaut

    Oui donc on a du multi tâches grâce aux tasks, et non via await / async

  10. #30
    Rédacteur/Modérateur
    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : juillet 2016
    Messages : 1 157
    Points : 3 713
    Points
    3 713
    Billets dans le blog
    5

    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 habitué Avatar de tlt
    Homme Profil pro
    Chef de projet, Developpeur Unity 3D, API Designer
    Inscrit en
    juillet 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Chef de projet, Developpeur Unity 3D, API Designer
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : juillet 2004
    Messages : 99
    Points : 187
    Points
    187

    Par défaut

    Bonjour.
    Juste une remarque: Il y a un problème avec le lien pdf du tuto.

  12. #32
    Rédacteur/Modérateur
    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : juillet 2016
    Messages : 1 157
    Points : 3 713
    Points
    3 713
    Billets dans le blog
    5

    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
    Développeur informatique
    Inscrit en
    mars 2003
    Messages
    1 110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

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

    Informations forums :
    Inscription : mars 2003
    Messages : 1 110
    Points : 2 110
    Points
    2 110
    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.

    Chef de projet / Développeur

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

  14. #34
    Rédacteur/Modérateur
    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : juillet 2016
    Messages : 1 157
    Points : 3 713
    Points
    3 713
    Billets dans le blog
    5

    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
    Rédacteur/Modérateur
    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : juillet 2016
    Messages : 1 157
    Points : 3 713
    Points
    3 713
    Billets dans le blog
    5

    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 et Delphi
    Inscrit en
    juillet 2002
    Messages
    629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : juillet 2002
    Messages : 629
    Points : 1 413
    Points
    1 413

    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
    Rédacteur/Modérateur
    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : juillet 2016
    Messages : 1 157
    Points : 3 713
    Points
    3 713
    Billets dans le blog
    5

    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

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 Langage
    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