Нет прямого механизма в WF, чтобы автоматически обнаруживал, когда объект изменился - это оставляет вам три варианта:
- Приостановите рабочий процесс и используйте внешний код для его возобновления при изменении состояния внешнего объекта.
- Внутри рабочего процесса добавьте действие Delay в структуру While, которая периодически проверяет объект на предмет изменений.
- Публикация события на объекте, которое срабатывает при изменении состояния объекта.
Опции 1 и 2 основаны на механизме опроса - в одном случае он реализован вне рабочего процесса, а в других - в нем. Вариант 3 использует шаблон Subject / Observer с событиями для уведомления рабочего процесса, когда происходит изменение.
Вариант 3 относительно легко реализовать с помощью WF EventDrivenActivity
- , см. Документацию MSDN здесь или небольшую вики-статью об этом здесь . Эта опция также желательна с точки зрения того, что, если на объекте есть последовательность переходов состояний, рабочий процесс уведомляется о каждом из них - тогда как модель опроса может выбирать только последнюю (или ту, которая произошла, когда опрос проводился) .
Опции 1 и 2 имеют смысл, если у вас нет доступа к коду объекта, который вы отслеживаете, и / или вы не можете изменить поведение объекта. В этих случаях опрос в значительной степени ваш единственный выбор.
Чтобы выбрать между 1 и 2, вам нужно определить, сколько одновременных рабочих процессов у вас будет, и все они могут ожидать изменения состояния. WF хорошо масштабируется, когда рабочие процессы могут быть приостановлены и записаны в постоянное хранилище - он масштабируется хуже, когда многие сотни (или тысячи) активных рабочих процессов должны быть одновременно активными в памяти. Если вы когда-нибудь ожидаете, что несколько долго выполняющихся рабочих процессов ожидают таких отслеживаемых изменений, вы можете продолжить и реализовать вариант 2 (использовать действие задержки рабочего процесса). Если вы ожидаете много таких рабочих процессов, вам лучше выполнять мониторинг в отдельном потоке и приостанавливать рабочие процессы до тех пор, пока им не будет чем заняться.
Если вы выберете вариант 2, убедитесь, что вы разработали альтернативный путь для рабочего процесса (время ожидания, уведомление, состояние и т. Д.), Чтобы не оставлять активные потерянные рабочие процессы, которые никогда не прекратятся, но будут продолжать потреблять ресурсы. .