es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo crear múltiples temporizadores en tiempo de ejecución en una aplicación de servicio de Windows.

Estoy tratando de crear varios temporizadores en tiempo de ejecución basados en la cantidad de tareas que obtendré de la base de datos. En el método onStart(), obtengo los datos de la base de datos y los guardo en una lista. Luego, itero sobre esta lista y creo un temporizador para cada tarea, guardando cada temporizador en una lista de Temporizadores.

for(int i=0;i<ScheduleTask.Count;i++)
{
    Timer t = new Timer(new TimerCallback(_=>Task(i)));
    DateTime scheduledTime = DateTime.MinValue;
    scheduledTime = DateTime.Now.AddMinutes(ScheduleTask[i].intervalMinutes);
    TimeSpan TimeSpan = scheduledTime.Subtract(DateTime.Now);                
    int dueTime = Convert.ToInt32(TimeSpan.TotalMilliseconds);
    t.Change(dueTime, Timeout.Infinite);
    timers.Add(t);
}

Quiero que cada tarea llame al mismo método, pero pasando a este método el índice de la tarea, pero el índice siempre es el mismo y es igual al último índice de las tareas programadas.

private void Task(int index)
{
    try
    {
        this.WriteToFile("*************" + ScheduleTask[index].Name + " Iniciada*****************");
        // tarea iniciada

        this.WriteToFile("*************" + ScheduleTask[index].Name + " Finalizada exitosamente {0}*****************");

    }
    catch
    {
        this.WriteToFile("*************algo salió mal en el índice: " + index + "*****************");

    }
}

¿Qué debo hacer?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema está con TimerCallback, que captura la variable “i” por referencia. Como resultado, en el momento en que se ejecuta el método Task, el valor de i ya está establecido en el último índice de la lista ScheduleTask. Para solucionar esto, puedes crear una variable local dentro del bucle y asignarle el valor de i, luego usar esa variable dentro de TimerCallback en lugar de i. Por ejemplo:

    for(int i=0;i<scheduletask.count;i++) {="" int="" taskindex="i;" crear="" una="" nueva="" variable="" y="" asignarle="" el="" valor="" de="" i="" timer="" t="new" timer(new="" timercallback(_="">Task(taskIndex)));
        DateTime scheduledTime = DateTime.MinValue;
        scheduledTime = DateTime.Now.AddMinutes(ScheduleTask[i].intervalMinutes);
        TimeSpan TimeSpan = scheduledTime.Subtract(DateTime.Now);                
        int dueTime = Convert.ToInt32(TimeSpan.TotalMilliseconds);
        t.Change(dueTime, Timeout.Infinite);
        timers.Add(t);
    }
    

    Ahora el método Task recibirá el valor de índice correcto para cada tarea.</scheduletask.count;i++)>

Comments are closed.