83 votes

ThreadPool.QueueUserWorkItem vs Task.Factory.StartNew

Quelle est la différence entre les éléments suivants

ThreadPool.QueueUserWorkItem

vs

Task.Factory.StartNew

Si le code ci-dessus est appelé 500 fois pour une tâche de longue durée, cela signifie-t-il que tous les threads du pool de threads seront occupés ?

Ou bien TPL (deuxième option) sera-t-il assez intelligent pour n'utiliser que des threads inférieurs ou égaux au nombre de processeurs ?

95voto

Jon Skeet Points 692016

Si vous voulez démarrer une tâche de longue durée avec TPL, vous devez spécifier TaskCreationOptions.LongRunning ce qui signifie qu'il n'a pas le programmer sur le pool de discussion (EDIT : comme indiqué dans les commentaires, cette est C'est une décision spécifique à l'ordonnanceur, et ce n'est pas une garantie absolue, mais j'espère que tout ordonnanceur de production sensé évitera de programmer des tâches longues sur un pool de threads).

Vous ne devriez certainement pas planifier vous-même un grand nombre de tâches de longue durée sur le pool de threads. Je crois que de nos jours, la taille par défaut du pool de threads est assez grande (parce qu'on en abuse souvent de cette façon), mais fondamentalement, il ne devrait pas être utilisé de cette façon.

Le but du pool de threads est d'éviter court les tâches qui subissent un choc important du fait de la création d'un nouveau fil, par rapport au temps d'exécution réel. Si la tâche s'exécute pendant une longue période, l'impact de la création d'un nouveau thread sera de toute façon relativement faible - et vous ne voulez pas vous retrouver potentiellement à court de threads de pool. (C'est moins probable maintenant, mais je ) a fait l'expérience sur les versions antérieures de .NET).

Personnellement, si j'en avais la possibilité, j'utiliserais sans hésiter TPL, car la Task L'API est très bien, mais faire n'oubliez pas d'indiquer à TPL que vous vous attendez à ce que la tâche s'exécute pendant une longue période.

EDIT : Comme indiqué dans les commentaires, voir aussi le billet de blog de l'équipe PFX sur choisir entre le TPL et le pool de fils :

En conclusion, je répéterai ce que le développeur ThreadPool de l'équipe CLR a déjà déclaré :

Task is now the preferred way to queue work to the thread pool.

EDIT : Toujours d'après les commentaires, n'oubliez pas que TPL vous permet d'utiliser les éléments suivants planificateurs personnalisés si tu veux vraiment...

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