L’appel de Task.wait ne peut pas attendre si la tâche n’a pas encore démarré?

Je lisais le message de Jeffrey Richter via c # book et me sentais mal à l’aise en lisant cette tâche.

“Lorsqu’un thread appelle la méthode Wait, le système vérifie si la tâche que le thread attend a commencé à s’exécuter. Si c’est le cas, l’appel du thread Wait bloquera jusqu’à ce que la tâche soit en cours d’exécution. Mais si la tâche n’a pas démarré Selon le TaskScheduler, le système peut exécuter la tâche en utilisant le thread qui a appelé Wait. Si cela se produit, le thread appelant Wait ne bloque pas; il exécute la tâche et retourne immédiatement. ”

Quelqu’un peut-il s’il vous plaît partager plus d’informations et dans quel cas un tel scénario peut-il se produire?

Je pense que c’est malheureusement libellé. Ce n’est pas que l’appel en Wait retourne avant que la tâche ait fini de s’exécuter; c’est que le thread qui appelle Wait peut finir par exécuter la tâche elle-même, plutôt que de simplement bloquer inutilement.

Exemple de code:

 using System; using System.Threading; using System.Threading.Tasks; class Test { static void Main() { // Make sure DemonstrateIssue is already called in a ThreadPool // thread... Task task = Task.Run((Action) DemonstrateIssue); task.Wait(); } static void DemonstrateIssue() { Console.WriteLine("DemonstrateIssue thread: {0}", Thread.CurrentThread.ManagedThreadId); Action action = () => Console.WriteLine("Inner task thread: {0}", Thread.CurrentThread.ManagedThreadId); Task task = new Task(action); // Calling Start will just schedule it... we may be able to Wait // before it actually executed task.Start(); task.Wait(); } } 

Sortie à chaque fois que je l’ai exécuté:

 DemonstrateIssue thread: 3 Inner task thread: 3 

Ceci tire parti du fait que le pool de threads ne crée pas immédiatement de threads à la demande. Il attend un moment pour voir si un thread existant sera disponible avant de démarrer un autre. Si vous ajoutez Thread.Sleep(5000); avant l’appel à task.Wait() , vous verrez que les deux tâches se terminent sur des threads différents.