using System;
using System.Threading;
using System.Threading.Tasks;
namespace Recetas.Multithreading.R0406
{
public class CancelacionEjecucionTarea
{
public static void Main()
{
Console.WriteLine ();
// Creación del manejador de cancelación:
var cts = new CancellationTokenSource();
// Creación de la tarea de ejecución extendida:
var tarea = new Task<int>(() =>
TareaExtendida("Tarea No. 1", 10, cts.Token), cts.Token);
// Visualización del estado de ejecución de la tarea:
Console.WriteLine ("Estado ejecución tarea no. 1: {0}.", tarea.Status);
// Emisión de la señal de cancelación:
cts.Cancel();
// Visualización del estado de ejecución de la tarea:
Console.WriteLine ("Estado ejecución tarea: {0}.", tarea.Status);
Console.WriteLine ("La primera tarea se ha cancelado antes de iniciar su ejecución.\n");
// Nuevo token de cancelación:
cts = new CancellationTokenSource();
// Segunda tarea de ejecución extendida:
tarea = new Task<int>(() =>
TareaExtendida("Tarea No. 2", 10, cts.Token), cts.Token);
// Inicio de la ejecución de la segunda tarea:
tarea.Start();
// Por cada iteración se visualiza el estado de ejecución de la segunda tarea:
for (int i = 1; i <= 5; ++i)
{
Thread.Sleep(TimeSpan.FromSeconds(0.5));
Console.WriteLine ("Estado ejecución tarea no. 2: {0}.", tarea.Status);
}
// Después de haber sido cancelada la ejecución de la tarea no. 2
// se vuelve a comprbar su estado de ejecución:
for (int i = 1; i <= 5; ++i)
{
Thread.Sleep(TimeSpan.FromSeconds(0.1));
Console.WriteLine (tarea.Status);
}
// Emisión de la señal de cancelación para la segunda tarea:
cts.Cancel();
// Se visualiza el resultado computado por la tarea no. 2:
Console.WriteLine ("\nLa tarea no. 2 se completó satisfactoriamente y su resultado es: {0}.\n",
tarea.Result);
}
private static int TareaExtendida(string nombre, int duracion,
CancellationToken token)
{
Console.WriteLine("La tarea `{0}` se está ejecutando en el ID de Thread {1}. "
+ "¿Thread en pool de threads?: {2}", nombre,
Thread.CurrentThread.ManagedThreadId,
Thread.CurrentThread.IsThreadPoolThread);
for (int i = 1; i <= duracion; ++i)
{
// Simula la ejecución extendida de este método:
Thread.Sleep(TimeSpan.FromSeconds(0.1));
// Comprueba si se ha emitido la señal de
// cancelación de la tarea:
if (token.IsCancellationRequested)
{
return -1;
}
}
// Cuando la tarea se ha ejecutado satisfactoriamente llega esta punto:
return 42 * duracion;
}
}
}