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 !

Programmer avec les pools de threads en C# - troisième partie : « async » et « await » pour la programmation asynchrone
Un tutoriel de François Dorin

Le , par François DORIN

24PARTAGES

13  0 
Bonjour à toutes et à tous,

Je vous propose un tutoriel pour apprendre l'utilisation du pool de threads en programmation C#. Vous pouvez le consulter à l'adresse suivante : http://fdorin.developpez.com/tutorie...eadpool/part1/

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

Retrouvez les meilleurs et tutoriels pour apprendre la programmation C#

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 Community Management
Community Manager https://www.developpez.com
Le 04/09/2016 à 20:18
Félicitations Dorinf pour cet excellent tutoriel qui peut aider à mieux organiser et optimiser son code pour améliorer les performances des applications programmées en C#
2  0 
Avatar de François DORIN
Expert éminent sénior https://www.developpez.com
Le 19/01/2017 à 17:23
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#
2  0 
Avatar de stailer
Membre chevronné https://www.developpez.com
Le 09/02/2017 à 11:01
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.
2  0 
Avatar de François DORIN
Expert éminent sénior https://www.developpez.com
Le 07/09/2016 à 10:22
Bonjour lutecefalco,

Tu as raison sur le fait que parallélisme et multi-threading sont deux notions différentes. Le multi-threading est un exemple particulier de parallélisme (tout comme l'utilisation d'instructions vectoriel ou encore l'utilisation d'architectures distribuées).

Maintenant, vue le contexte dans lequel cette phrase se situe, il n'y a aucune ambiguïté. D'autant plus que, d'après mon expérience, la plupart des gens ne sait pas réellement la différence entre ces deux notions et emploi, dans le langage courant, l'un comme l'autre.
1  0 
Avatar de François DORIN
Expert éminent sénior https://www.developpez.com
Le 07/09/2016 à 13:08
Modification faite
1  0 
Avatar de Community Management
Community Manager https://www.developpez.com
Le 14/10/2016 à 6:36
Merci Dorinf et félicitations pour cette deuxième partie
1  0 
Avatar de lutecefalco
Rédacteur https://www.developpez.com
Le 19/01/2017 à 20:39
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"
1  0 
Avatar de lutecefalco
Rédacteur https://www.developpez.com
Le 20/01/2017 à 7:31
Ouais mais là tu triches en passant par Task.Run
Si tu reprends ton exemple de code:

Code : Sélectionner tout
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
1  0 
Avatar de François DORIN
Expert éminent sénior https://www.developpez.com
Le 20/01/2017 à 9:09
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
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.
1  0