Мой сценарий представляет собой приложение, циклически работающее с данными в реальном времени и с жесткими сроками.
У меня есть ряд действий для обработки данных в каждом цикле. У меня есть действия, которые происходят в каждом цикле (назовем их заглавными буквами, например A, B, C..) и другие действия которые происходят только каждые x циклов (назовем их строчными буквами, такими как d, e, f,...). Примером шаблона потока, имеющего два постоянных действия и одно, происходящее с периодом в 3 цикла, может быть (конец цикла отмечен знаком «|»):
A - B - d | А - Б | А - Б | A - B - d |...
Более того, шаблон может меняться во время выполнения в зависимости от действий пользователей. Таким образом, некоторые действия могут быть добавлены или удалены из списка. Например, предыдущий шаблон с удалением B, добавлением C после A и e после C< /strong> с периодом в 2 цикла вдруг станет (цикл изменения помечен '->'):
...| A - B - d | -> A - d - C - e | А - В | A - C - e | A - d - C | A - C - e | А - В | A - d - C - e |...
Прямо сейчас я запускаю вручную потоки, которые взаимодействуют друг с другом через WaitHandles и которые, если действие тяжелое, используют Parallel.For. Затем, когда шаблон изменится, мне, возможно, придется, например, завершить определенный поток, запустить другой, заменить WaitHandle, на котором нужно ждать... У меня возникают проблемы с взаимоблокировкой, которые возникают при изменении шаблона. Я мог бы их исправить, но пришел к мысли, что было бы гораздо лучше иметь более гибкое решение, чтобы, если мне нужно будет изменить шаблон позже, у меня уже были все инструменты, чтобы сделать это эффективно.
Я довольно новичок в этой теме, но я думаю (следуя также тому, что мне было предложено previoulsy) Мне нужен своего рода планировщик.
Я кое-что читал о Windows Workflow Foundation (на данный момент я не знаю, подходит ли он для моей ситуации) и других решениях, но мне нужно знать, в каком направлении лучше двигаться, прежде чем тратить время на его понимание. Например Задачи больше подходят для этого? Или я должен придерживаться потоков и создать класс планировщика для управления всеми возможными ситуациями (в этом случае я вижу уже разные проблемы с изменением шаблонов, и я был бы признателен, если бы вы могли углубиться в проблему)? Или есть лучшие альтернативы?
[EDIT]
Действия могут быть выполнены, когда предыдущее основное действие (A, B,...) в цикле завершилось. Незначительные действия (d, e,...) могут выполняться одновременно. Например, в цикле типа A - B - d - e действие B может быть выполнено только после A, действие d только после B и действие e только после B , а также, возможно, одновременно с d. Более того, если я не группирую два последовательных основных действия (в примере можно подумать, что A и B можно сгруппировать в одно действие из-за их взаимозависимости), это означает которые выполняются в двух разных потоках. Причина этого в том, что я использую циклические буферы для хранения промежуточных результатов (в примере результат поступает от A и позже будет использоваться B). Буферы помогают мне не терять данные во время процесса в реальном времени, если по какой-то причине происходит задержка в процессе (на самом деле основное действие лидера A всегда будет происходить с хорошей точностью по времени, независимо от последнего действие в цикле завершилось или нет).