Какой шаблон кода лучше всего подходит для обработки циклического и изменчивого потока действий - PullRequest
3 голосов
/ 25 февраля 2011

Мой сценарий - это приложение, работающее циклически на данных в реальном времени и в сжатые сроки.

У меня есть серия действий, которые нужно выполнять с данными на каждом цикле.У меня есть действия, которые происходят в каждом цикле (давайте назовем их заглавными буквами, такими как A , B , C ..) и другими действиями, которые происходяттолько каждые x циклов (назовем их строчными буквами, такими как d , e , f , ...).Пример схемы потока с двумя постоянными действиями и выполнением одного с периодом 3 цикла может быть (конец цикла отмечен '|'):

A - B - d | A - B | A - B | A - B - d | ...

Кроме того, шаблон может измениться во время выполнения в соответствии с пользовательским вводом.Таким образом, некоторые действия могут быть добавлены или удалены из списка.Например, предыдущий шаблон, удалив B , добавив C после A и e после C с помощьюпериод из 2 циклов внезапно станет (изменить цикл, помеченный '->'):

... | A - B - d |-> A - d - C - e | A - C | A - C - e | A - d - C | A - C - e | A - C | 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 * * 1 139.Более того, если я не сгруппирую два последовательных основных действия (в примере можно подумать, что A и B могут быть сгруппированы в одно отдельное действие из-за их взаимозависимости), это означает, чтовыполнено в двух разных темах.Причина этого в том, что я использую циклические буферы для хранения промежуточных результатов (в примере результат, полученный из A , и который позже будет использоваться B ).Буферы помогают мне не потерять данные во время процесса в реальном времени, если по какой-то причине процесс задерживается (фактически, основное действие лидера A всегда будет происходить с хорошей точностью синхронизации независимо от последнего действияв цикле закончилась или нет).

1 Ответ

0 голосов
/ 25 февраля 2011

Я бы порекомендовал изучить рабочий процесс Windows и связать делегатов с изменениями состояния конечного автомата.

Вы можете отслеживать количество циклов CycleIteration = cycle ++% MaxCycleCount

И запускать цикл на основекакая итерация.

Для каждой итерации цикла вы будете иметь рабочий поток, поэтому назовите его:

Итерация цикла 0: A - B - d

Итерация цикла 1: A -B

Итерация цикла 2: A - B

Итерация цикла 3: A - B - d

...

Каждое изменение состояния цикла вКонечный автомат рабочего процесса основан на количестве итераций.Каждый ваш отдельный метод будет иметь делегат, определенный как рабочий элемент, завернутый в делегат для повторного использования.

Каждый рабочий процесс итерации цикла будет сохранен и вызван FSM и будет выглядеть следующим образом:

CycleIteration1Execute (...) {callA (...);callB (...);callD (...);вернуть;}

Тогда изменение порядка и состояний цикла будет поддерживаться в небольших логически легко поддерживаемых фрагментах.

Редактировать (Предоставление примеров для реализации WF):

Пример WF Finite State Machine: Это ОЧЕНЬ пример для начинающих, который иллюстрирует, как выполнить FSM с двумя состояниями.

http://www.codeproject.com/KB/dotnet/FirstStateMachineWorkflow.aspx

Примерпредоставлено M $ (Как и во всех их примерах, очень многословно, но дает немного более сложный пример):

http://msdn.microsoft.com/en-us/magazine/cc163281.aspx

И самое лучшее для последнего,очень хорошо составленное сообщение в блоге на State Machine с использованием WF

http://odetocode.com/code/460.aspx

...