O segundo método, Task.Run
foi introduzido em uma versão posterior da estrutura .NET (no .NET 4.5).
No entanto, o primeiro método Task.Factory.StartNew
,, oferece a oportunidade de definir muitas coisas úteis sobre o encadeamento que você deseja criar, enquanto Task.Run
não fornece isso.
Por exemplo, digamos que você deseja criar um encadeamento de tarefas de execução longa. Se um encadeamento do conjunto de encadeamentos for usado para esta tarefa, isso poderá ser considerado um abuso do conjunto de encadeamentos.
Uma coisa que você poderia fazer para evitar isso seria executar a tarefa em um thread separado. Um encadeamento recém-criado que seria dedicado a esta tarefa e seria destruído assim que sua tarefa fosse concluída. Você não pode conseguir isso com o Task.Run
, enquanto pode fazê-lo com o Task.Factory.StartNew
, como abaixo:
Task.Factory.StartNew(..., TaskCreationOptions.LongRunning);
Como se afirma aqui :
Portanto, na visualização do desenvolvedor do .NET Framework 4.5, introduzimos o novo método Task.Run. Isso de forma alguma obsoleta o Task.Factory.StartNew,
mas deve ser pensado como uma maneira rápida de usar o
Task.Factory.StartNew sem precisar especificar vários parâmetros. É um atalho. De fato, o Task.Run é realmente implementado em termos da mesma lógica usada para Task.Factory.StartNew, apenas transmitindo alguns parâmetros padrão. Quando você passa uma ação para Task.Run:
Task.Run(someAction);
isso é exatamente equivalente a:
Task.Factory.StartNew(someAction,
CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
StartNew
por padrão, usosTaskScheduler.Current
que podem ser o pool de threads, mas também podem ser o thread da interface do usuário.