Estoy buscando implementar un proceso "Heartbeat" para realizar muchas tareas de limpieza repetidas a lo largo del día.¿Cómo cambiarías mi proceso Heartbeat escrito en C#?
Esto parecía una buena oportunidad de utilizar el patrón de comandos, así que tengo una interfaz que se parece a:
public interface ICommand
{
void Execute();
bool IsReady();
}
continuación, he creado varias tareas que quiero ser ejecutado. Aquí está un ejemplo básico:
public class ProcessFilesCommand : ICommand
{
private int secondsDelay;
private DateTime? lastRunTime;
public ProcessFilesCommand(int secondsDelay)
{
this.secondsDelay = secondsDelay;
}
public void Execute()
{
Console.WriteLine("Processing Pending Files...");
Thread.Sleep(5000); // Simulate long running task
lastRunTime = DateTime.Now;
}
public bool IsReady()
{
if (lastRunTime == null) return true;
TimeSpan timeSinceLastRun = DateTime.Now.Subtract(lastRunTime.Value);
return (timeSinceLastRun.TotalSeconds > secondsDelay);
}
}
Por último, mi aplicación de consola se ejecuta en este bucle de espera en busca de tareas para añadir a la ThreadPool:
class Program
{
static void Main(string[] args)
{
bool running = true;
Queue<ICommand> taskList = new Queue<ICommand>();
taskList.Enqueue(new ProcessFilesCommand(60)); // 1 minute interval
taskList.Enqueue(new DeleteOrphanedFilesCommand(300)); // 5 minute interval
while (running)
{
ICommand currentTask = taskList.Dequeue();
if (currentTask.IsReady())
{
ThreadPool.QueueUserWorkItem(t => currentTask.Execute());
}
taskList.Enqueue(currentTask);
Thread.Sleep(100);
}
}
}
no tengo mucha experiencia con multi-threading más allá de algún trabajo que hice en la clase de Sistemas Operativos. Sin embargo, hasta donde puedo decir, ninguno de mis hilos está accediendo a ningún estado compartido, por lo que deberían estar bien.
¿Esto parece un diseño "OK" para lo que quiero hacer? ¿Hay algo que cambiarías?
# 1: me gustaría agregar que literalmente puede quedarse sin hilos de grupo de subprocesos, lo que hace que su aplicación se bloquee por completo. Esta es la razón por la cual nunca permites que los hilos entren en tu ThreadPool. –
+1 para el punto sobre tareas de ejecución corta para el grupo de subprocesos. –
@Jonathan Allen, buen punto, agregué una nota al respecto en mi respuesta. –