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
.