J'ai récemment essayé de comprendre les nouvelles fonctions async/await et Task.Run de C#. Ce faisant, j'ai écrit un code de test simple qui écrit sur la console pour que je puisse voir dans quel ordre les choses arrivent, jetant un Thread.Sleep ici et là pour m'assurer que les choses se passent vraiment dans l'ordre attendu.Thread.Sleep dans Task.Run
Voici un de mes tests
[Test]
public void TaskRun()
{
Console.WriteLine("Before");
Task.Run(() => Console.WriteLine(_terminator.IWillBeBack()));
Console.WriteLine("After");
}
avec la classe Terminator suivante:
public class Terminator
{
public string IWillBeBack()
{
return "I will be back";
}
}
De ce que j'attendais résultat le plus probablement Avant, Après, puis Je serai de retour. C'est en effet ce qui arrive. Ensuite, je fais un changement à la méthode IWillBeBack pour lui permettre de dormir pendant 3 secondes. Le code pour cela:
public class Terminator
{
public string IWillBeBack()
{
Thread.Sleep(3000);
return "I will be back";
}
}
J'attend que le résultat soit encore Avant, Après, puis au bout de 3 secondes à nouveau je serai de retour. Ce n'est pas ce qui se passe quand même. Je reçois à la place Avant et Après, mais jamais je serai de retour.
Pourquoi est-ce?
Lorsque je débogue, il passe clairement par le code, dormant et revenant. Je n'ai pas besoin de Thread.Sleep de cette façon dans n'importe quel code de production, mais je voudrais avoir une vague compréhension de pourquoi je serai de retour n'est pas écrit dans la console dans le second cas.
Je m un peu paresseux aujourd'hui, donc je vais juste faire référence à la réponse. J'ai écrit quelque chose sur ce sujet il y a quelques jours qui pourrait aider à comprendre TPL + async/await: http://blog.tedd.no/2012/07/28/asyncawait-http-server-in-c/ –