La mejor manera es utilizar la Biblioteca paralelo de tareas (TPL) y continuaciones. Una continuación no solo le permite crear un flujo de tareas sino que también maneja sus excepciones. Este es un great introduction para el TPL. Pero para darle una idea ...
Puede iniciar una tarea TPL usando
Task task = Task.Factory.StartNew(() =>
{
// Do some work here...
});
ahora para iniciar una segunda tarea cuando un antecedente finalice la tarea (por error o éxito) se puede utilizar el método ContinueWith
Task task1 = Task.Factory.StartNew(() => Console.WriteLine("Antecedant Task"));
Task task2 = task1.ContinueWith(antTask => Console.WriteLine("Continuation..."));
Así que tan pronto como se complete task1
, falla o se cancela task2
'incendios-up' y comienza a ejecutarse. Tenga en cuenta que si se hubiera completado task1
antes de llegar a la segunda línea del código task2
, se programará para ejecutarse inmediatamente. El argumento antTask
pasado a la segunda lambda es una referencia a la tarea antecedente. Ver this link para ejemplos más detallados ...
También puede pasar continuaciones resultados de la tarea antecedente
Task.Factory.StartNew<int>(() => 1)
.ContinueWith(antTask => antTask.Result * 4)
.ContinueWith(antTask => antTask.Result * 4)
.ContinueWith(antTask =>Console.WriteLine(antTask.Result * 4)); // Prints 64.
Nota. Asegúrese de leer sobre el manejo de excepciones en el primer enlace provisto, ya que esto puede llevar a un recién llegado al TPL por mal camino.
Una última cosa a tener en cuenta en particular para lo que quiere es tareas para niños. Las tareas secundarias son aquellas que se crean como AttachedToParent
. En este caso, la continuación no se ejecutará hasta que todas las tareas secundarias han completado
TaskCreationOptions atp = TaskCreationOptions.AttachedToParent;
Task.Factory.StartNew(() =>
{
Task.Factory.StartNew(() => { SomeMethod() }, atp);
Task.Factory.StartNew(() => { SomeOtherMethod() }, atp);
}).ContinueWith(cont => { Console.WriteLine("Finished!") });
espero que esto ayude.
Entonces, ¿por qué no haces un gran delegado? – SLaks
para agregar a lo que dijo @SLaks, si solo tiene una lista de cosas para ejecutar, usar algo como BackgroundWorker podría ser más simple. Lo realmente desconocido es lo que desea que suceda cuando el trabajo en segundo plano esté terminado. Suponiendo que se trate de algún tipo de actualización de UI, BackgroundWorker ya lo maneja ejecutando el delegado completo en el hilo de la interfaz de usuario. –