Tengo una aplicación WinForms que consta de un subproceso de interfaz de usuario principal y 4 tareas. Mi forma principal tiene una variable de nivel de miembro privado como esto:Formulario de cierre con tareas que ejecutan
private bool keepThreadsRunning = false;
En el evento Load() de mi forma principal, tengo el siguiente:
keepThreadsRunning = true;
var task1Worker = Task.Factory.StartNew(() => DoStuff1());
var task2Worker = Task.Factory.StartNew(() => DoStuff2());
var task3Worker = Task.Factory.StartNew(() => DoStuff3());
var task4Worker = Task.Factory.StartNew(() => DoStuff4());
En el interior de cada uno de mis DoStuff() métodos, tengo básicamente esto:
while (keepThreadsRunning)
{
// do work here
Thread.Sleep(30000); // a couple of my tasks only need to run every 30 seconds or so
}
por último, en mi controlador de eventos Form_Closing(), tengo el siguiente:
keepThreadsRunning = false;
this.Close();
Viendo mi aplicación en el administrador de tareas, parece que el proceso finaliza cuando cierro mi formulario, pero estoy un poco confundido acerca de las cuatro tareas. ¿Mi llamada a this.Close() realmente hace que esas tareas finalicen (incluso si están en la llamada Thread.Sleep() cuando suceden)? ¿Y hay una forma mejor de lograr esto que la forma en que estoy codificando en este momento?
EDITAR - He examinado brevemente la cancelación de tareas (cuando se cierra mi aplicación), pero tengo entendido que mis tareas necesitarían comprobar periódicamente el token de cancelación para determinar si se han cancelado. Dado que algunas de mis tareas deben ejecutarse cada 30 segundos, no pude entender cómo implementaría esa espera de 30 (actualmente, Thread.Sleep()) y aún tengo la tarea de verificar el token de cancelación.