429 votes

Différences entre les tâches et les threads

Je suis novice en matière de programmation parallèle. Il existe deux classes disponibles dans .NET : Task et Thread.

La question est donc : Quelle est la différence entre ces classes ? Quand est-il préférable d'utiliser Thread et quand Task ?

531voto

Jon Skeet Points 692016

Thread est un concept de niveau inférieur : si vous démarrez directement un fil de discussion, vous connaître il s'agira d'un thread séparé, plutôt que de s'exécuter sur le pool de threads, etc.

Task est plus qu'une simple abstraction de "l'endroit où exécuter du code" - il s'agit en fait de "la promesse d'un résultat dans le futur". Voici donc quelques exemples différents :

  • Task.Delay n'a pas besoin de temps CPU réel ; c'est comme programmer une minuterie qui se déclenchera dans le futur.
  • Une tâche renvoyée par WebClient.DownloadStringTaskAsync ne prendra pas beaucoup de temps CPU localement ; il représente un résultat qui risque de passer la plupart de son temps en latence réseau ou en travail à distance (au niveau du serveur web)
  • Une tâche renvoyée par Task.Run() vraiment est en disant "Je veux que vous exécutiez ce code séparément" ; le fil exact sur lequel ce code s'exécute dépend d'un certain nombre de facteurs.

Notez que le Task<T> est essentielle à la prise en charge de l'asynchronisme dans C# 5.

En général, je vous recommande d'utiliser l'abstraction de niveau supérieur chaque fois que vous le pouvez : dans un code C# moderne, vous devriez rarement avoir besoin de démarrer explicitement votre propre thread.

54voto

Roman Pokrovskij Points 1310

La tâche est un concept de plus haut niveau et cela signifie :

  1. Vous ne pouvez pas utiliser l'exception Abort/ThreadAbortedException, vous devez prendre en charge la fonction cancel dans votre "code métier" en testant périodiquement l'indicateur IsCancellationRequested (et pour cela, évitez les connexions longues ou sans durée, par exemple à la base de données, sinon vous n'aurez jamais l'occasion de tester cet indicateur).

  2. Il n'y a pas non plus de fonctionnalité des méthodes thread.Suspend et thread.Resume.

  3. Mais vous obtenez deux nouveaux outils : continuations et tâches imbriquées/enfants Ces deux exemples illustrent l'idée et la syntaxe :

// continuation - execute the delegate, when all tasks[] had been finished
Task.Factory.ContinueWhenAll(
  tasks,
  () =>
  {
    int answer = tasks[0].Result + tasks[1].Result;
    Console.WriteLine("The answer is {0}", answer);
  }
);

//StartNew - starts task immediately, parent ends whith child
var parent = Task.Factory.StartNew
(() => {
          var child = Task.Factory.StartNew(() =>
            {
            //...
            });
         },  
   TaskCreationOptions.AttachedToParent
);

43voto

Justin Points 42106

Le site Thread est utilisée pour créer et manipuler un filetage dans Windows.

A Task représente une opération asynchrone et fait partie de l'ensemble de l'opération. Bibliothèque parallèle des tâches L'ensemble des API permettant d'exécuter des tâches de manière asynchrone et en parallèle.

Dans le passé (c'est-à-dire avant la TPL), il était courant d'utiliser la fonction Thread était l'un des moyens standard d'exécuter du code en arrière-plan ou en parallèle (une meilleure alternative était souvent d'utiliser une classe de type ThreadPool ), mais cette méthode était lourde et présentait plusieurs inconvénients, dont le moindre n'était pas l'augmentation des performances due à la création d'un tout nouveau thread pour effectuer une tâche en arrière-plan.

Aujourd'hui, l'utilisation des tâches et de la TPL est une bien meilleure solution dans 90 % des cas, car elle fournit des abstractions qui permettent une utilisation bien plus efficace des ressources du système. J'imagine qu'il existe quelques scénarios dans lesquels vous souhaitez contrôler explicitement le thread sur lequel vous exécutez votre code, mais de manière générale, si vous souhaitez exécuter quelque chose de manière asynchrone, votre premier port d'appel devrait être la TPL.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X