Quelle est la différence entre Task et Thread?

Aujourd’hui, je creusais avec TPL et ai trouvé une nouvelle classe Task.Maintenant, je voulais juste savoir quelle est la différence entre task et Thread, et laquelle est la meilleure?

Quelle est la différence entre une tâche et un fil?

Supposons que vous dirigez une entreprise de livraison de livres. Vous avez quatre voitures et quatre conducteurs. Une voiture est un fil de discussion, un pilote est un processeur et la livraison d’un livre est une tâche. Le problème que vous rencontrez est de savoir comment planifier efficacement les pilotes et les voitures de manière à ce que les tâches soient effectuées le plus rapidement possible.

Là où les choses deviennent étranges, c’est quand il y a plus de voitures (threads) que de pilotes (processeurs). À mi-parcours, le conducteur stationne une voiture (suspend le fil) et pénètre dans une autre voiture (contexte de commutation), la conduit pendant un certain temps pour effectuer des tâches, puis revient à la première voiture. De toute évidence, ce n’est pas aussi efficace que de restr dans une voiture.

L’idée du parallélisme basé sur les tâches est de diviser le travail en petites tâches pouvant produire des résultats à l’avenir , puis d’allouer efficacement autant de threads qu’il y a de processeurs afin de ne pas perdre de temps à changer de contexte. En pratique, cela ne fonctionne généralement pas bien, mais c’est l’idée.

lequel est le meilleur, tâche ou fil?

On ne peut pas répondre à la question car cela n’a aucun sens. Quel est le meilleur, un livre à livrer à un client, ou une voiture pour le livrer? Une voiture est un appareil qui peut être utilisé pour livrer un livre. ces deux choses ne sont pas des choses que vous pouvez raisonnablement qualifier de «meilleures» ou de «pires» que les autres. C’est comme demander “quel est le meilleur, un trou ou une perceuse?”

Une “tâche” est un travail qui s’exécutera et se terminera ultérieurement.

Un “fil” est comment quelque chose est exécuté.

Généralement, lorsque vous créez une tâche par défaut (c.-à-d. À l’aide de Task.Factory.StartNew ), la Task sera programmée pour s’exécuter sur un thread ThreadPool à un moment donné. Cependant, ce n’est pas toujours vrai.

L’avantage de cette séparation est que vous autorisez le framework (ou vous-même, si vous utilisez un TaskScheduler personnalisé) pour contrôler la manière dont votre travail est mappé sur les threads disponibles. Généralement, vous aurez beaucoup plus d’éléments de travail que de threads. Vous pouvez traiter un million d’éléments à traiter, mais seulement 8 cœurs dans votre système. Dans une situation comme celle-ci, il est beaucoup plus efficace d’utiliser un nombre fixe de threads et de faire en sorte que chaque thread traite plusieurs éléments de travail. En séparant “Task” de “Thread”, vous rompez ce couplage travail == thread.

En général, je recommanderais d’utiliser Task au lieu de créer vos propres threads. Il s’agit d’un modèle beaucoup plus agréable, plus puissant et plus souple à utiliser pour le développement, d’autant plus qu’il permet de gérer les exceptions de manière très propre, de générer des tâches intéressantes, telles que des continuations, etc.

Voici quelques différences:

  • Par défaut, Task utilise un pool de threads tandis que l’utilisation directe de Thread nécessite la création d’un nouveau thread.
  • Task gérera les exceptions et les résultats, facilitant son utilisation.
  • Task peut prendre en charge l’annulation lorsque vous utilisez des threads, vous devez l’implémenter vous-même.

Une tâche signifie une action ou un travail que vous voulez faire.

Un fil peut être l’un des auteurs ou des travailleurs qui travaillent.

Selon la documentation de référence MSDN :

La bibliothèque parallèle de tâches (TPL) est un ensemble de types et d’API publics dans les espaces de noms System.Threading et System.Threading.Tasks dans .NET Framework version 4. L’objective est de rendre les développeurs plus productifs en simplifiant d’append le parallélisme et la concurrence aux applications. La TPL adapte le degré de concurrence de manière dynamic pour utiliser de la manière la plus efficace possible tous les processeurs disponibles. En outre, la TPL gère le partitionnement du travail, la planification des threads sur le ThreadPool, la prise en charge de l’annulation, la gestion des états et d’autres détails de bas niveau. En utilisant TPL, vous pouvez optimiser les performances de votre code tout en vous concentrant sur le travail que votre programme est conçu pour accomplir.

Il apparaît donc qu’une tâche est le moyen préféré pour coder une opération asynchrone, car une grande partie du travail est prise en charge par le cadre. Par contre, Thread est toujours disponible pour le code existant et pour les cas dans lesquels vous souhaitez explicitement affecter et gérer un thread de système d’exploitation.