
Envoyé par
lutecefalco
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.

Envoyé par
lutecefalco
Si tu reprends ton exemple de code:
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 |