Как получить outArgument WorkflowApplication, когда wf ожидает ответа (закладка ИЛИ простаивает), но не завершено

Доступ к исходящим аргументам с помощью WorkflowApplication, когда мы ждем ответа (закладка ИЛИ в режиме ожидания), но не завершены


person user2384492    schedule 16.05.2013    source источник


Ответы (3)


Еще проще: используйте другое действие рабочего процесса, чтобы где-то сохранить значение, которое вы ищете (база данных, файл, ...), прежде чем начинать ждать ответа!

person fabsenet    schedule 16.05.2013

Я также использовал отслеживание для извлечения значений, но вместо того, чтобы сохранять его в базе данных, я придумал следующее решение.
Сделать отслеживающим участником и собирать данные из действия. Вы можете точно настроить профиль участника отслеживания с помощью специального запроса отслеживания. Я добавил общедоступное свойство Output, чтобы установить значение данных из записи.

public class CustomTrackingParticipant : TrackingParticipant
{
        //TODO: Fine tune the profile with the correct query.
        public IDictionary<String, object> Outputs { get; set; }
        protected override void Track(TrackingRecord record, TimeSpan timeout)
        {
            if (record != null)
            {
                if (record is CustomTrackingRecord)
                {
                    var customTrackingRecord = record as CustomTrackingRecord;
                    Outputs = customTrackingRecord.Data;
                }
            }
        }
    }

В настраиваемом действии вы можете установить значения, которые хотите предоставить для отслеживания с помощью CustomTrackingRecord. Вот образец, чтобы дать вам представление.

protected override void Execute(NativeActivityContext context)
{
    var customRecord = new CustomTrackingRecord("QuestionActivityRecord");
    customRecord.Data.Add("Question", Question.Get(context));
    customRecord.Data.Add("Answers", Answers.Get(context).ToList());
    context.Track(customRecord);
    //This will create a bookmark with the display name and the workflow will go idle.
    context.CreateBookmark(DisplayName, Callback, BookmarkOptions.None);
}

На экземпляре WorklfowApplication вы можете добавить участника отслеживания к расширениям.

workflowApplication.Extensions.Add(new CustomTrackingParticipant());

На устойчивое событие простоя из экземпляра workflowApplication я подписался с помощью следующего метода. В методе я получаю участника отслеживания из расширений. Поскольку мы установили выходы в общедоступном свойстве, мы можем получить к ним доступ и установить их в члене вне рабочего процесса. См. Следующий пример.

private PersistableIdleAction PersistableIdle(WorkflowApplicationIdleEventArgs 
workflowApplicationIdleEventArgs)
{
    var ex = workflowApplicationIdleEventArgs.GetInstanceExtensions<CustomTrackingParticipant>();
    Outputs = ex.First().Outputs;
    return PersistableIdleAction.Unload;
}

Надеюсь, этот пример помог.

person wkalter    schedule 22.08.2013

Вы можете использовать отслеживание.

необходимые шаги:

  • определить профиль отслеживания, который запрашивает ActivityStates с закрытым состоянием
  • Реализуйте TrackingParticipant, чтобы сохранить OutArgument в памяти процесса, в базе данных или в файле на диске.
  • соединить все вместе

Ссылка содержит всю информацию, которая вам понадобится для этого.

person fabsenet    schedule 16.05.2013