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