Quanto ao uso de Task.Start (), Task.Run () e Task.Factory.StartNew ()

Acabei de ver 3 rotinas sobre o uso de TPL que fazem o mesmo trabalho; aqui está o código:

public static void Main() { Thread.CurrentThread.Name = "Main"; // Create a task and supply a user delegate by using a lambda expression. Task taskA = new Task( () => Console.WriteLine("Hello from taskA.")); // Start the task. taskA.Start(); // Output a message from the calling thread. Console.WriteLine("Hello from thread '{0}'.", Thread.CurrentThread.Name); taskA.Wait(); } public static void Main() { Thread.CurrentThread.Name = "Main"; // Define and run the task. Task taskA = Task.Run( () => Console.WriteLine("Hello from taskA.")); // Output a message from the calling thread. Console.WriteLine("Hello from thread '{0}'.", Thread.CurrentThread.Name); taskA.Wait(); } public static void Main() { Thread.CurrentThread.Name = "Main"; // Better: Create and start the task in one operation. Task taskA = Task.Factory.StartNew(() => Console.WriteLine("Hello from taskA.")); // Output a message from the calling thread. Console.WriteLine("Hello from thread '{0}'.", Thread.CurrentThread.Name); taskA.Wait(); } 

Eu simplesmente não entendo porque o MS oferece três maneiras diferentes de executar tarefas no TPL, porque todas elas funcionam da mesma maneira: Task.Start() , Task.Run() e Task.Factory.StartNew() .

Diga-me, Task.Start() , Task.Run() e Task.Factory.StartNew() todos usados ​​para o mesmo propósito ou têm significados diferentes?

Quando alguém deve usar Task.Start() , quando deve usar Task.Run() e quando deve usar Task.Factory.StartNew() ?

Por favor me ajude a entender o seu uso real, conforme cenário em grande detalhe com exemplos, obrigado.

    Task.Run é um atalho para Task.Factory.StartNew com argumentos seguros específicos:

     Task.Factory.StartNew( action, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default); 

    Foi adicionado no .net 4.5 para ajudar com o uso cada vez mais freqüente de trabalho async e offloading para o ThreadPool .

    Task.Factory.StartNew (adicionado com o TPL no .Net 4.0) é muito mais robusto. Você só deve usá-lo se Task.Run não for suficiente, por exemplo, quando você quiser usar TaskCreationOptions.LongRunning (embora seja desnecessário quando o delegado é asynchronous. Mais sobre isso no meu blog: LongRunning é inútil para Task.Run com async – espera ). Mais sobre Task.Factory.StartNew em Task.Run vs Task.Factory.StartNew

    Nunca crie uma Task e chame Start() menos que você encontre uma boa razão para isso. Ele só deve ser usado se você tiver alguma parte que precise criar tarefas, mas não agendá-las e outra parte que programe sem criar. Isso quase nunca é uma solução adequada e pode ser perigoso. Mais em “Task.Factory.StartNew” vs “nova tarefa (…). Iniciar”

    Em conclusão, use principalmente Task.Run , use Task.Factory.StartNew se você precisar e nunca usar o Start .