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 :

Différence entre Async/Await et le multithreading


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 183
    Points : 89
    Points
    89
    Par défaut Différence entre Async/Await et le multithreading
    Bonjour,

    Je me demande quelle était la différence entre utiliser les mots clés Async/await ou juste le multithreading que l'on utilise déjà depuis quelques temps maintenant ?

  2. #2
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    async/await n'est rien d'autre qu'une sur-couche au dessus de la TPL (elle même une surcouche des outils de multi-threading .Net) qui permet de "linéariser" l'écriture de code asynchrone, là où les continuations introduites avec la TPL pouvaient s'imbriquer sur n niveaux rendant la compréhension du code plus difficile.

    Le principe est directement repris de Node.js et d'autres projets similaires et c'est donc surtout pertinent pour les traitements I/O-bound.
    Les équipes de Microsoft ont fait un gros travail d'intégration pour que l'utilisation soit relativement transparente depuis C# notamment.

    Donc si tu as de l'existant utilisant la TPL, le pool, ou directement des threads, inutile de tout casser pour passer à async/await.
    En revanche pour le nouveau code tu peux te poser la question au cas par cas.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 183
    Points : 89
    Points
    89
    Par défaut
    Merci pour ta réponse très détaillée .

    Je pars de zéro donc effectivement je me pose la question. D'ailleurs, j'ai lu que Async/Await ne créait pas de thread, donc du coup, quid de la parallélisation et de l'avantage des threads d'être découpés sur divers coeurs de processeur ? (on est dans la perf pure mais vu les traitements que j'ai à réaliser cette question est pertinente )

  4. #4
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    async/await encapsule une infrastructure plus complexe qui peut en effet ne pas créer de thread, typiquement dans le cadre des interfaces graphiques (WinForms, WPF, WinRT...).

    Mais async/await n'est pas vraiment un outil de parallélisation, plutôt d'asynchronie, pour éviter de monopoliser des threads pour l'attente I/O.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  5. #5
    Membre habitué

    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Juillet 2009
    Messages : 62
    Points : 157
    Points
    157
    Par défaut
    Concernant la parallélisation, je préconise (dans la mesure du possible) d'utiliser l'API .NET Parallel.XXXX (Parallel.For, Parallel.ForEach, ...)
    Mais attention de paralléliser n'est pas forcement gagnant à tous les coups. Le fait de paralléliser à un coup (synchronisation des threads, appel de la fonction delegate, ..)

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 183
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par lemoussel Voir le message
    Concernant la parallélisation, je préconise (dans la mesure du possible) d'utiliser l'API .NET Parallel.XXXX (Parallel.For, Parallel.ForEach, ...)
    Mais attention de // n'est pas forcement gagnant à tous les coups. Le fait de // à un coup (synchronisation des threads, appel de la fonction delegate, ..)
    J'utilise assez souvent le parallélisme des boucles For et effectivement la courbe des performances est loin d'être linéaire. Quand je parlais de parallélisation, je parlais plutôt de l'affectation des threads à un coeur de processeur différent (ex: un thread traitement d'image sur un coeur, un thread GUI sur un autre coeur et un thread connectivité sur une autre coeur). Ce genre de parallélisation est implicite et est géré par l'OS.

    Si je découpe mon code avec plusieurs méthodes méthodes asynchrones Async/Await, celles-ci seront elles "parallélisées" implicitement par l'OS de la même manière qu'avec les threads ?

  7. #7
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Citation Envoyé par pitipilot Voir le message
    D'ailleurs, j'ai lu que Async/Await ne créait pas de thread, donc du coup
    Le propos n'a pas de sens, tu as mal compris le rôle d'async/await. Async/await ne distribue pas les tâches, ce sont simplement des moyens commodes de les enchaîner pour linéariser l'écriture.

    * Utiliser await ne démarre pas une opération, c'est le rôle de l'expression derrière await. Await ne fait que connecter la tâche renvoyée par cette expression au point d'exécution courant. Quant cette sous-tâche sera terminé, le travail reprendra à partir du point d'exécution actuel et, par défaut, sur le contexte de synchronisation actuel (le thread UI par exemple).

    * Utiliser async n'a aucun impact sur l'exécution de la fonction elle-même. Cette fonction s'exécutera de façon synchrone comme n'importe quelle fonction jusqu'au moment où elle rencontrera un await (elle se terminera alors). Là encore c'est donc l'expression derrière await qui crée le parallélisme (ou non).


    L'expression derrière await peut donc choisir de créer un thread, de balancer sur la thread poo, etc. C'est à elle et à elle seule de décider quoi faire. Par exemple Task.Run ou Parallel.xxx balanceront des travaux sur le ThreadPool, lequel crée des threads au besoin et les réutilise ensuite pour les futurs travaux.

    En revanche j'insiste sur le fait qu'une fois la sous-tâche terminée le travail reprend par défaut sur le contexte de synchronisation d'origine. Le thread UI est un exemple de contexte de synchronisation : toute opération démarrée sur celui-ci reprendra par défaut sur celui-ci après le await. Un autre exemple est le contexte du ThreadPool : toute opération démarrée sur un thread du ThreadPool reprendra par défaut sur un thread du ThreadPool, mais pas forcément le même puisqu'ils forment ensemble un seul contexte.



    Si tu n'as pas compris, demande-moi et je te donnerai un exemple de la façon dont async/await sont traduits.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 183
    Points : 89
    Points
    89
    Par défaut
    Bonjour Donquiche,

    Si tu n'as pas compris, demande-moi et je te donnerai un exemple de la façon dont async/await sont traduits.
    Pour être sûr, je veux bien si possible que tu me donne un exemple .

  9. #9
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Citation Envoyé par pitipilot Voir le message
    Pour être sûr, je veux bien si possible que tu me donne un exemple .
    Ok, alors considérons par exemple le code suivant :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    async Task DaFunc(int x)
    {
        Start();
        await SomeAsyncStuff();
        Conclude(x);
    }

    Est compilé en tant que :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Task DaFunc(x)
    {
         Start();
         return SomeAsyncStuff().ContinueWith(() => Conclude(x), TaskScheduler.FromCurrentSynchronizationContext);
    }


    Si SomeAsyncStuff() lance une opération asynchrone, alors la fonction DaFunc va tout de suite se terminer sans attendre la fin de l'opération. En revanche quand celle-ci sera terminée le contenu de ContinueWith sera exécuté sur le thread UI (le contexte de synchronisation courant quand DaFunc fut exécuté).

Discussions similaires

  1. [C#] Différence Async, Await, MultiThreading
    Par same66 dans le forum Débuter
    Réponses: 2
    Dernier message: 14/03/2013, 09h25
  2. Différence entre un "bidouilleur" et un Pro ?
    Par christ_mallet dans le forum Débats sur le développement - Le Best Of
    Réponses: 290
    Dernier message: 28/11/2011, 10h53
  3. Différence entre TCP, UDP, ICMP
    Par GliGli dans le forum Développement
    Réponses: 1
    Dernier message: 13/09/2002, 08h25
  4. Différences entre jmp, jz, jnz, etc
    Par christbilale dans le forum Assembleur
    Réponses: 3
    Dernier message: 05/07/2002, 15h09
  5. Réponses: 3
    Dernier message: 07/05/2002, 16h06

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