99 votes

Création de threads - Task.Factory.StartNew vs new Thread()

Je suis en train de découvrir les nouvelles bibliothèques Threading et Parallel de .Net 4.

Auparavant, je créais un nouveau fil de discussion comme suit (à titre d'exemple) :

DataInThread = new Thread(new ThreadStart(ThreadProcedure));
DataInThread.IsBackground = true;
DataInThread.Start();

Maintenant, je peux le faire :

Task t = Task.Factory.StartNew(() =>
{
   ThreadProcedure();
});

Quelle est la différence, le cas échéant ?

Merci

78voto

sanosdole Points 1577

Il y a une grande différence. Les tâches sont planifiées sur le ThreadPool et peuvent même être exécutées de manière synchrone si cela est approprié.

Si vous avez un travail de fond de longue haleine, vous devez le spécifier en utilisant l'option de tâche appropriée.

Vous devriez préférer la bibliothèque parallèle des tâches à la gestion explicite des threads, car elle est plus optimisée. Vous disposez également de plus de fonctionnalités comme la continuité.

73voto

Jon Skeet Points 692016

La tâche vous donne tous les avantages de l'API de la tâche :

  • Ajout de continuations ( Task.ContinueWith )
  • Attendre l'achèvement de plusieurs tâches (toutes ou une seule)
  • Capturer les erreurs dans la tâche et les interroger ultérieurement
  • Capturer l'annulation (et vous permettre de spécifier l'annulation pour commencer)
  • Avoir potentiellement une valeur de retour
  • Utilisation de await en C# 5
  • Meilleur contrôle de la planification (si la tâche doit être longue, dites-le lorsque vous la créez afin que le planificateur de tâches puisse en tenir compte).

Notez que dans les deux cas, vous pouvez rendre votre code légèrement plus simple grâce aux conversions de groupes de méthodes :

DataInThread = new Thread(ThreadProcedure);
// Or...
Task t = Task.Factory.StartNew(ThreadProcedure);

12voto

alexandrekow Points 733

Dans le premier cas, vous commencez simplement un nouveau fil, tandis que dans le second, vous entrez dans le pool de fils.

El réserve de fils Le travail consiste à partager et à recycler les fils. Cela permet d'éviter de perdre quelques millisecondes à chaque fois que l'on doit créer un nouveau thread.

Il existe plusieurs façons d'entrer dans le pool de fils :

  • avec le TPL (Task Parallel Library) comme vous l'avez fait
  • en appelant ThreadPool.QueueUserWorkItem
  • en appelant BeginInvoke sur un délégué
  • lorsque vous utilisez un Travailleur d'arrière-plan

1voto

s_nair Points 602

Votre premier bloc de code demande à CLR de créer un thread (disons T) pour vous, qui peut être exécuté en arrière-plan (utilisez les threads du pool de threads pour planifier T ). En résumé, vous demandez explicitement à CLR de créer un thread pour vous afin de faire quelque chose et vous appelez la méthode Start() sur le thread pour le démarrer.

Votre deuxième bloc de code fait la même chose, mais délègue (remet implicitement) la responsabilité de la création du thread (arrière-plan - qui s'exécute à nouveau dans le pool de threads) et du thread de départ par la méthode StartNew dans l'implémentation de la Task Factory.

Il s'agit d'une différence rapide entre des blocs de code donnés. Cela dit, il y a quelques différences détaillées que vous pouvez rechercher sur Google ou voir d'autres réponses de mes collègues contributeurs.

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