web-dev-qa-db-fra.com

ThreadPool.QueueUserWorkItem vs Task.Factory.StartNew

quelle est la différence entre ce qui suit

ThreadPool.QueueUserWorkItem

contre

Task.Factory.StartNew

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

Ou le TPL (2e option) sera-t-il suffisamment intelligent pour n'occuper que des threads inférieurs ou égaux au nombre de processeurs?

73
stackoverflowuser

Si vous allez démarrer une tâche de longue durée avec TPL, vous devez spécifier TaskCreationOptions.LongRunning , ce qui signifie qu'il ne le planifie pas sur le pool de threads. (EDIT: Comme indiqué dans les commentaires, ceci est une décision spécifique au planificateur et n'est pas une garantie ferme et rapide, mais j'espère que tout planificateur de production raisonnable éviterait de planifier des tâches de longue durée sur un pool de threads.)

Vous ne devez certainement pas planifier vous-même un grand nombre de tâches de longue durée sur le pool de threads. Je crois que ces jours-ci, la taille par défaut du pool de threads est assez grande (car elle est souvent utilisée abusivement de cette manière) mais fondamentalement, elle ne devrait pas être utilisée comme ça.

Le but du pool de threads est d'éviter les tâches courtes qui prennent un gros coup de la création d'un nouveau thread, par rapport au temps qu'elles sont réellement en cours d'exécution. 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 finir par potentiellement manquer de threads de pool de threads. (C'est moins probable maintenant, mais j'ai fait l'expérience sur les versions antérieures de .NET.)

Personnellement, si j'avais l'option, j'utiliserais certainement TPL au motif que l'API Task est plutôt sympa - mais ne souvenez-vous pour indiquer à TPL que vous vous attendez à ce que la tâche s’exécute pendant longtemps.

EDIT: comme indiqué dans les commentaires, voir également le blog de l'équipe PFX sur choisir entre le TPL et le pool de threads :

En conclusion, je réitère 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: Aussi des commentaires, n'oubliez pas que TPL vous permet d'utiliser planificateurs personnalisés , si vous voulez vraiment ...

89
Jon Skeet