WF4: получить информацию об аргументе / переменной в режиме ожидания

Это похоже на простую проблему: у меня есть действие WF4, которое направляет пользователя через ряд вопросов. После отображения каждого вопроса действие должно быть приостановлено до тех пор, пока на вопрос не будет дан ответ. После ответа на каждый вопрос я хочу предложить пользователю следующий вопрос. (Следующий вопрос определяется на основании ответа на предыдущий вопрос.)

Для этого у меня есть простое действие рабочего процесса, реализующее закладку. У меня есть консольное приложение, в котором рабочий процесс запускается с помощью WorkflowApplication.Run, ожидает ввода и затем вызывает .ResumeBookmark.

Что мне нужно сделать, так это получить значение Current_Question_Text из рабочего процесса, когда он переходит в режим ожидания. Я установил свойство WorkflowApplication.Idle для делегата, и в этом делегате я хотел бы получить текст текущего вопроса, хранящийся в Activity. Однако выходные аргументы недоступны до тех пор, пока не сработает метод Completed, а WorkflowApplicationIdleEventArgs не предоставит никакой информации о текущем состоянии данных.

Я также посмотрел на переменные Activity и WorkflowApplication в делегате Idle и не вижу способа получить таким образом данные.

Есть ли способ получить значения данных из Activity, когда он простаивает?

Спасибо, Дэвид Бергетт


person dburgett    schedule 05.04.2010    source источник


Ответы (1)


Есть несколько способов сделать это. Что лучше всего работает, зависит от обстоятельств.

  1. Явно сохраните переменную во внешнем месте, например в базе данных, и попросите клиента прочитать ее оттуда. Легко сделать с помощью настраиваемого действия, но добавит еще одно отключение к вашему приложению.
  2. Используйте постоянство рабочего процесса и повышение свойства, чтобы извлечь значение и сохранить его в хранилище экземпляров рабочего процесса. Продвигаемые свойства не самые лучшие для работы, и для этого требуется использование WorkflowInstanceStore. Кроме того, значение обновляется только при сохранении рабочего процесса.
  3. Использование настраиваемого расширения отслеживания рабочего процесса и извлечение значения с помощью ActivityStateQuery. Я подозреваю, что во многих случаях это был бы самый простой подход.
person Maurice    schedule 06.04.2010
comment
Спасибо, Морис! Вариант 3 был именно тем, что я искал! Я создал настраиваемое расширение отслеживания, которое запускалось, когда мои действия не выполнялись. Затем он сгенерировал событие, которое обработало мое приложение, обновив пользовательский интерфейс текстом следующего вопроса. Идеально! - person dburgett; 08.04.2010
comment
Вы можете объяснить, как вам это удалось? Я тоже пытаюсь сделать то же самое. Не могу понять концепцию. - person Kasun Koswattha; 18.03.2016