startnew run parallel net ejemplo await async asp c# .net async-await task-parallel-library

run - task startnew c#



Con respecto al uso de Task.Start(), Task.Run() y Task.Factory.StartNew() (1)

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 todas funcionan igual: Task.Start() , Task.Run() y Task.Factory.StartNew() .

Dime, ¿se Task.Start() , Task.Run() y Task.Factory.StartNew() para el mismo propósito o tienen un significado diferente?

¿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 del trabajo async y de descarga al 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 usar TaskCreationOptions.LongRunning (aunque es innecesario cuando el delegado es asíncrono. Más sobre eso en mi blog: LongRunning es inútil para Task.Run con async -Espera ). 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 razón extremadamente buena para hacerlo. Solo debe usarse si tiene alguna parte que necesita crear tareas pero no programarlas y otra parte que programa sin crear. Esa casi nunca es una solución adecuada y podría ser peligrosa. Más en "Task.Factory.StartNew" versus "new Task (...). Start"

En conclusión, use principalmente Task.Run , use Task.Factory.StartNew si debe usar y nunca use Start .