Manejo de la clase Task

Task Parallel Library (TPL)

Desde Framework 4 en adelante , nos encontramos con el concepto de Task para el manejo o ejecución de tareas asincronas. Realmente es una librería muy útil e intuitiva .

Pongámonos en la situación que queremos realizar una tarea asincrona, ya que sabemos que nos va a requerir demasiado tiempo, y si la ejecutásemos sincronamente esto provocaría el bloqueo de la aplicación hasta su finalización.

Para lanzar una rutina asincronamente utilizando el objeto Task únicamente necesitaremos  las siguientes lineas de código:

 Task mainTask = Task.Factory.StartNew(() =>
 {
                for (int i = 0; i < 100000; i++)
                {                
                    Console.WriteLine(String.Format("Msg {0}",i));
}
});

Bien, con este simple código, conseguimos realizar el printado por pantalla de 100.000 mensajes sin que provocar que el sistema se quede bloqueado.

Ahora, imaginémonos que hay la posibilidad de cancelar una Task, a demanda del usuario . Como podríamos realizar esta operación , si al crear la rutina dentro de una Task, perdemos la referencia a dicho rutina (esto puedes comprobarlo, debugando el código, y observaras que el flujo de la aplicación continua , sin pararse en la rutina de dentro de la Task) ?

Pues de la siguiente forma:

CancellationTokenSource tokenSource = new CancellationTokenSource();
CancellationToken cancellationToken = tokenSource.Token;

Task firstTask = Task.Factory.StartNew(() =>
{
                for (int i = 0; i < 100000; i++)
                {
                    if (cancellationToken.IsCancellationRequested)
                    {
                        break;
                    }

                    Console.WriteLine(i);
                }
}, cancellationToken);

tokenSource.Cancel();

Como podemos observar, únicamente tenemos que crear un objeto llamado “CancellationToken” que deberemos asociarlo a la task, de esta forma , podremos realizar comprobaciones del estado de dicho token, y saber si se ha realizado una petición de cancelación de la Task.

Bueno, como podéis observar es un ejemplo muy sencillo, pero partiendo de este punto , podéis aplicar esta técnica a cualquier problema con mayor o menor dificultad .

Saludos cordiales.

Anuncios