En cuanto al uso de Task.Start (), Task.Run () y Task.Factory.StartNew ()

Acabo de ver 3 rutinas con respecto al uso de TPL que hacen el mismo trabajo; aquí está el 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(); } 

Simplemente no entiendo por qué MS ofrece 3 formas diferentes de ejecutar trabajos en TPL porque todos funcionan igual: Task.Start() , Task.Run() y Task.Factory.StartNew() .

Dime, ¿ Task.Start() , Task.Run() y Task.Factory.StartNew() usaron todos con el mismo propósito o tienen diferente significado?

¿Cuándo se debe usar Task.Start() , cuándo se debe usar Task.Run() y cuándo se debe usar Task.Factory.StartNew() ?

Ayúdenme a comprender su uso real según el escenario en gran detalle con ejemplos, gracias.

Task.Run es una abreviatura de Task.Factory.StartNew con argumentos seguros específicos:

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

Se agregó en .Net 4.5 para ayudar con el uso cada vez más frecuente de trabajos de ThreadPool y descarga en ThreadPool .

Task.Factory.StartNew (agregado con TPL en .Net 4.0) es mucho más robusto. Solo debe usarlo si Task.Run no es suficiente, por ejemplo, cuando desea utilizar TaskCreationOptions.LongRunning (aunque no es necesario cuando el delegado es asíncrono. Más sobre eso en mi blog: LongRunning es inútil para Task.Run With async -await ). Más sobre Task.Factory.StartNew en Task.Run vs Task.Factory.StartNew

Nunca cree una Task y llame a Start() menos que encuentre una muy buena razón para hacerlo. Solo debe usarse si tiene alguna parte que necesita crear tareas pero no las progtwig y otra parte que progtwig sin crear. Eso casi nunca es una solución adecuada y podría ser peligroso. Más en “Task.Factory.StartNew” contra “nueva tarea (…). Start”

En conclusión, utiliza principalmente Task.Run , utiliza Task.Factory.StartNew si debes y nunca utilizas Start .