cuál es la forma correcta de cancelar varias tareas en c#
c#-4.0 task-parallel-library (3)
Tengo un botón que genera 4 tareas. El mismo botón cambia a un botón cancelar y al hacer clic esto debería cancelar las 4 tareas. ¿Debo pasar el mismo token de cancelación a las 4 tareas y hacer que sondeen en el mismo token para IsCancelRequested? Estoy confundido después de leer el documento msdn sobre createlinkedtokensource . ¿Cómo se hace esto normalmente? gracias
Actualización: Task.WaitAll () espera completa todas las tareas para completar la ejecución . De forma similar, saber cómo se cancelaron todas las tareas una vez que la fuente de token de cancelación compartida está configurada para cancelar.
Sí, debe pasar el mismo token y usar esto para cancelar todas las tareas de una vez, si esa es su intención.
Utilice la clase BackroundWorker , establezca la propiedad WorkerSupportsCancellation , inicie tareas llamando a RunWorkerAsync () y deténgalos usando CancelAsync ()
No necesita sincronizar su código con la interfaz de usuario.
Sí, lo que dijiste sobre el uso de un solo CancellationToken
es correcto. Puede crear un solo CancellationTokenSource
y usar su CancellationToken
para todas las tareas. Sus tareas deben verificar el token regularmente para la cancelación.
Por ejemplo:
const int NUM_TASKS = 4;
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken ct = cts.Token;
Task[] tasks = new Task[NUM_TASKS];
for (int i = 0; i < NUM_TASKS; i++)
{
tasks[i] = Task.Factory.StartNew(() =>
{
while (true)
{
Thread.Sleep(1000);
if (ct.IsCancellationRequested)
break;
}
}, ct);
}
Task.WaitAll(tasks);
Su botón puede llamar a cts.Cancel();
para cancelar las tareas.
Actualización para la actualización de la pregunta:
Hay algunas maneras de hacer lo que preguntas. Una forma es usar ct.IsCancellationRequested
para verificar la cancelación sin tirar, luego permita que su tarea se complete. Luego Task.WaitAll(tasks)
se completará cuando se hayan cancelado todas las tareas.
He actualizado el código para reflejar ese cambio.