Я смотрю на реализацию процесса «Heartbeat» для выполнения множества повторяющихся задач очистки в течение дня.
Это хороший шанс использовать шаблон Command, поэтому у меня есть интерфейс, который выглядит следующим образом:
public interface ICommand
{
void Execute();
bool IsReady();
}
Затем я создал несколько задач, которые хочу запустить. Вот базовый пример:
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);
}
}
Наконец, мое консольное приложение запускается в этом цикле в поисках ожидающих задач для добавления в 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);
}
}
}
У меня нет большого опыта в многопоточности, кроме той работы, которую я делал в классе «Операционные системы». Однако, насколько я могу судить, ни один из моих потоков не имеет доступа к общему состоянию, поэтому они должны быть в порядке.
Похоже ли это на "ОК" дизайн для того, что я хочу сделать? Есть ли что-нибудь, что вы бы изменили?