Доступ к исходящим аргументам с помощью WorkflowApplication, когда мы ждем ответа (закладка ИЛИ в режиме ожидания), но не завершены
Как получить outArgument WorkflowApplication, когда wf ожидает ответа (закладка ИЛИ простаивает), но не завершено
Ответы (3)
Еще проще: используйте другое действие рабочего процесса, чтобы где-то сохранить значение, которое вы ищете (база данных, файл, ...), прежде чем начинать ждать ответа!
Я также использовал отслеживание для извлечения значений, но вместо того, чтобы сохранять его в базе данных, я придумал следующее решение.
Сделать отслеживающим участником и собирать данные из действия. Вы можете точно настроить профиль участника отслеживания с помощью специального запроса отслеживания. Я добавил общедоступное свойство 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;
}
Надеюсь, этот пример помог.
Вы можете использовать отслеживание.
необходимые шаги:
- определить профиль отслеживания, который запрашивает ActivityStates с закрытым состоянием
- Реализуйте TrackingParticipant, чтобы сохранить OutArgument в памяти процесса, в базе данных или в файле на диске.
- соединить все вместе
Ссылка содержит всю информацию, которая вам понадобится для этого.