У меня есть список объектов, на каждом из которых есть метод bool ShouldRun ().
В настоящее время я перебираю список объектов, проверяю mustRun () для каждого объекта и вызываю Run () для первого, возвращающего true
foreach (child in Children)
{
if (child.ShouldRun())
{
child.Run();
break;
}
}
Я бы хотел сделать это параллельно, потому что оценка shouldRun может занять приличное количество времени, и полезно, чтобы более поздние элементы в коллекции начали свою оценку раньше.
Однако я не могу придумать, как это сделать, чтобы удовлетворить этим условиям:
1 Запустить только один предмет
2 Не запускать более поздний элемент, если предыдущий элемент является истинным или еще не завершил оценку
3 Если все «более ранние» элементы вернули false, а средний элемент вернул true, не ждите, пока более поздний элемент завершит оценку, потому что вы знаете, что он не может ничего переопределить ранее.
Я думал о том, чтобы выполнить параллельный запрос "где" linq, чтобы получить все элементы, которые следует выполнить (), а затем отсортировать, но это нарушит условие # 3
Идеи
Справочная информация:
Система предназначена для обобщенной робототехнической системы искусственного интеллекта.
Некоторые задачи с более высоким приоритетом могут быть вызваны сразу известными переменными датчика, например: Я падаю, исправьте это!
другие задачи могут потребовать значительных вычислительных ресурсов (выполнить распознавание изображения с камеры и приблизиться к видимым целям)
другие задачи могут быть выполнены с помощью базы данных или удаленно (найдите список возможных местоположений объектов в базе данных, а затем перейдите туда, чтобы узнать, сможете ли вы попасть в видимый диапазон одного из них)
Некоторые из самих задач имеют дочерние задачи, что, по сути, приведет к рекурсивному запуску этого процесса в подмножестве задач, и задача внука будет передана по цепочке