Я не знаю, как закодированы ваши задачи, но кажется, что они могут быть инкапсулированы в команды , которые затем будут помещены в очередь или в какую-либо другую структуру данных.Как только они сняты с производства, их логика проверяется.Если им нужно запустить, они выполняются, и они не возвращаются в очередь.Если их логика говорит, что они не должны запускаться, они просто возвращаются в очередь, чтобы иметь возможность запускаться позже.
Ваш интерфейс будет выглядеть примерно так:
public interface ITaskSink {
void AddTask(ICommandTask task);
}
public interface ICommandTask {
bool ShouldRun();
void Run(ITaskSink sink);
}
Задачиможет также быть в состоянии добавить другие задачи в структуру данных (таким образом, Run
принимает ITaskSink
в качестве параметра), покрывая ваше требование создания подзадачи.Задача может даже добавить себя обратно в приемник, устраняя необходимость в методе ShouldRun
и упрощая ваш класс процессора задач.