c# ejemplo - En cuanto al uso de Task.Start(), Task.Run()y Task.Factory.StartNew()




parallel asp (2)

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 programa y otra parte que programa 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 .

Acabo de ver 3 rutinas relacionadas con el uso de TPL que hace 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() .

Dígame, ¿ Task.Start() , Task.Run() y Task.Factory.StartNew() usan con el mismo propósito o tienen diferente significado?

Cuando uno debería usar Task.Start() , cuando Task.Run() y cuando uno debería usar Task.Factory.StartNew() ?

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


El tipo Task<TResult> requiere que devuelva un TResult de su tarea. Si no tiene nada que devolver, puede usar la Task lugar (que, por cierto, es la clase base de la Task<TResult> ).

Pero tenga en cuenta que una tarea no es un hilo. Una tarea es un trabajo a realizar, mientras que un subproceso es un trabajador. A medida que se ejecuta su programa, los trabajos y los trabajadores están disponibles y no están disponibles. Detrás de escena, la biblioteca asignará sus trabajos a los trabajadores disponibles y, como la creación de nuevos trabajadores es una operación costosa, por lo general preferirá reutilizar los existentes, a través de un grupo de subprocesos.





c# .net async-await task-parallel-library