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

Достъп до изходящи аргументи с WorkflowApplication, когато wf изчака отговор(отметка ИЛИ неактивен) и не е завършен


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


Отговори (3)


Още по-просто: Използвайте друга дейност на работен поток, за да съхраните някъде стойността, която търсите (база данни, файл, ...), преди да започнете да чакате отговор!

person fabsenet    schedule 16.05.2013

Използвах също Tracking за извличане на стойностите, но вместо да го запазя в база данни, стигнах до следното решение.
Направете Trackingparticipant и събирайте данните от дейност. Можете да настроите фино профила на участника в проследяването с конкретна заявка за проследяване. Добавих публично свойство 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