Kontrola drzewa działań
Inspekcja drzewa aktywności jest używana przez autorów aplikacji przepływu pracy do sprawdzania przepływów pracy hostowanych przez aplikację. Za pomocą funkcji WorkflowInspectionServicesmożna wyszukiwać przepływy pracy dla określonych działań podrzędnych, poszczególne działania i ich właściwości można wyliczyć, a metadane środowiska uruchomieniowego działań mogą być buforowane w określonym czasie. Ten temat zawiera omówienie i sposób jego używania do inspekcji WorkflowInspectionServices drzewa działań.
Korzystanie z elementu WorkflowInspectionServices
Metoda GetActivities służy do wyliczania wszystkich działań w określonym drzewie działań. GetActivities Zwraca wyliczenie, które dotyka wszystkich działań w drzewie, w tym elementów podrzędnych, procedur obsługi delegatów, wartości domyślnych zmiennych i wyrażeń argumentów. W poniższym przykładzie definicja przepływu pracy jest tworzona przy użyciu Sequencewyrażeń , While, ForEach<T>, WriteLinei . Po utworzeniu definicji przepływu pracy jest wywoływana, a następnie wywoływana InspectActivity
jest metoda .
Variable<List<string>> items = new Variable<List<string>>
{
Default = new VisualBasicValue<List<string>>("New List(Of String)()")
};
DelegateInArgument<string> item = new DelegateInArgument<string>();
Activity wf = new Sequence
{
Variables = { items },
Activities =
{
new While((env) => items.Get(env).Count < 5)
{
Body = new AddToCollection<string>
{
Collection = new InArgument<ICollection<string>>(items),
Item = new InArgument<string>((env) => "List Item " + (items.Get(env).Count + 1))
}
},
new ForEach<string>
{
Values = new InArgument<IEnumerable<string>>(items),
Body = new ActivityAction<string>
{
Argument = item,
Handler = new WriteLine
{
Text = item
}
}
},
new Sequence
{
Activities =
{
new WriteLine
{
Text = "Items added to collection."
}
}
}
}
};
WorkflowInvoker.Invoke(wf);
InspectActivity(wf, 0);
Aby wyliczyć działania, GetActivities element jest wywoływany dla działania głównego i ponownie cyklicznie dla każdego zwróconego działania. W poniższym przykładzie DisplayName każde działanie i wyrażenie w drzewie działań są zapisywane w konsoli programu .
static void InspectActivity(Activity root, int indent)
{
// Inspect the activity tree using WorkflowInspectionServices.
IEnumerator<Activity> activities =
WorkflowInspectionServices.GetActivities(root).GetEnumerator();
Console.WriteLine("{0}{1}", new string(' ', indent), root.DisplayName);
while (activities.MoveNext())
{
InspectActivity(activities.Current, indent + 2);
}
}
Ten przykładowy kod zawiera następujące dane wyjściowe.
Element listy 1
Element listy 2. Element listy 3. Element listy 4. Element listy 5dodany do kolekcji.Ciąg listy<literałów sekwencji<>>
While
Ciąg AddToCollection<>
Ciąg ICollection<zmiennejValue<>>
Ciąg lambdaValue<>
Ciąg listy<LocationReferenceValue<>>
Wartość logiczna lambdaValue<>
Ciąg listy<LocationReferenceValue<>>
Ciąg ForEach<>
Ciąg IEnumerable<zmiennejValue<>>
WriteLine
Ciąg DelegateArgumentValue<>
Sekwencja
WriteLine
Jest używany ciąg> literału<Aby pobrać określone działanie zamiast wyliczać wszystkie działaniaResolve. Buforowanie metadanych zarówno Resolve , jak i GetActivities , jeśli WorkflowInspectionServices.CacheMetadata
nie zostało wcześniej wywołane. Jeśli CacheMetadata została wywołana GetActivities , jest oparta na istniejących metadanych. W związku z tym, jeśli zmiany drzewa zostały wprowadzone od ostatniego wywołania metody CacheMetadata, GetActivities może dać nieoczekiwane wyniki. Jeśli zmiany zostały wprowadzone w przepływie pracy po wywołaniu metody GetActivities, metadane można ponownie buforować, wywołując metodę ActivityValidationServices Validate . Metadane buforowania zostały omówione w następnej sekcji.
Buforowanie metadanych
Buforowanie metadanych dla działania kompiluje i weryfikuje opis argumentów, zmiennych, działań podrzędnych i delegatów działań. Metadane domyślnie są buforowane przez środowisko uruchomieniowe, gdy działanie jest przygotowane do wykonania. Jeśli autor hosta przepływu pracy chce buforować metadane dla drzewa działań lub działań przed tym, na przykład do wykonania wszystkich kosztów z góry, CacheMetadata może służyć do buforowania metadanych w żądanym czasie.