ThreadPool.QueueUserWorkItem vs Task.Fabrica.Início
Qual é a diferença entre os valores abaixo
ThreadPool.QueueUserWorkItem
Vs
Task.Factory.StartNew
Se o código acima é chamado 500 vezes para uma tarefa longa, isso significa que todos os tópicos do grupo de linhas serão ocupados?
ou a TPL (segunda opção) será suficientemente inteligente para aceitar threads com menor ou igual número de processadores?
1 answers
Se vai iniciar uma tarefa de longa duração com o TPL, deve especificar TaskCreationOptions.LongRunning
, o que significa que ele não o agendou na lista de linhas. (EDIT: como observado nos comentários, este é uma decisão específica do scheduler, e não é uma garantia dura e rápida, mas espero que qualquer escalonador de produção sensato evite agendar tarefas de longa duração em um grupo de threads.)
O ponto do conjunto de fios é evitartarefas curtas tomar um grande sucesso de criar um novo tópico, em comparação com o tempo que eles estão realmente a correr. Se a tarefa estiver em execução por um longo tempo, o impacto de criar um novo tópico será relativamente pequeno de qualquer maneira - e você não quer acabar potencialmente a ficar sem tópicos de bilhar de linhas. (É menos provável agora, mas eufiz experimentá-lo em versões anteriores da. NET.)
Pessoalmente, Se eu tivesse a opção, eu definitivamente usaria TPL com o fundamento de que a API {[[2]} é muito boa-mas do lembre-se de dizer à TPL que espera que a tarefa dure por muito tempo.
Editar: como indicado nos comentários, Veja também o post da equipa da PFX no escolher entre a TPL e o grupo de tópicos:
Em conclusão, vou reiterar o que o desenvolvedor de ThreadPool da equipa da CLR já disse:
Task is now the preferred way to queue work to the thread pool.
Editar: também a partir de comentários, não se esqueça que o TPL lhe permite usar escalonadores personalizados, Se realmente quiser...