web-dev-qa-db-fra.com

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

Je viens tout juste d'apprendre les nouvelles bibliothèques Threading et Parallel dans .Net 4

Dans le passé, je créais un nouveau sujet tel que so (à titre d'exemple):

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

Maintenant je peux faire:

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

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

Merci

97
Jon

Il y a une grosse 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 convient.

Si votre travail en arrière-plan est long, vous devez le spécifier en utilisant l'option de tâche appropriée.

Vous devriez préférer Task Parallel Library à la gestion de threads explicite, car elle est plus optimisée. Aussi, vous avez plus de fonctionnalités comme Continuation.

77
sanosdole

La tâche vous donne tout le bien de son API:

  • Ajout de continuations (Task.ContinueWith)
  • En attente de la réalisation de plusieurs tâches (toutes ou toutes)
  • Capturer les erreurs dans la tâche et les interroger plus tard
  • Capture de l'annulation (et vous permettant de spécifier l'annulation pour commencer)
  • Ayant potentiellement une valeur de retour
  • Utilisation de wait en C # 5
  • Meilleur contrôle de la planification (si la tâche doit durer longtemps, dites-le lorsque vous créez la tâche afin que le planificateur de tâches puisse en tenir compte)

Notez que dans les deux cas, vous pouvez légèrement simplifier votre code avec les conversions de groupe de méthodes:

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

Dans le premier cas, vous démarrez simplement un nouveau thread alors que dans le second, vous entrez dans le pool de threads.

Le travail thread pool consiste à partager et à recycler les threads. Cela permet d'éviter de perdre quelques millisecondes à chaque fois que nous devons créer un nouveau thread. 

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

  • avec le TPL (bibliothèque parallèle de tâches) comme vous l'avez fait
  • en appelant ThreadPool.QueueUserWorkItem
  • en appelant BeginInvoke sur un délégué 
  • lorsque vous utilisez un BackgroundWorker
12
alexandrekow

Votre premier bloc de code indique à CLR de créer pour vous un thread (par exemple, T) pouvant être exécuté en arrière-plan (utilisez les threads du pool de threads lors de la planification de T). En résumé, vous demandez explicitement au CLR de créer un fil pour vous permettre de faire quelque chose et appelez la méthode Start () sur le fil pour commencer.

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

C'est une différence rapide entre les blocs de code donnés. Cela dit, il y a peu de différences détaillées sur lesquelles vous pouvez chercher sur Google ou voir les autres réponses de mes collègues collaborateurs.

0
s_nair