共用方式為


活動樹狀結構檢查

活動樹狀檢查可供工作流程應用程式作者用於檢查應用程式所裝載的工作流程。 使用 WorkflowInspectionServices,即可針對特定子活動搜尋工作流程、列舉個別活動及其屬性,以及在特定時間快取活動的執行階段中繼資料。 本主題提供 WorkflowInspectionServices 的概觀,並且說明如何利用它來檢查活動樹狀結構。

使用 WorkflowInspectionServices

GetActivities 方法用於列舉指定活動樹狀中的所有活動。 GetActivities 會傳回可列舉項目,該項目會觸及樹狀結構中的所有活動,包括子系、委派處理常式、預設變數及引數運算式。 在下列範例中,工作流程定義是使用 SequenceWhileForEach<T>WriteLine 和運算式所建立。 建立工作流程定義之後,就會叫用該工作流程,然後呼叫 InspectActivity 方法。

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);

為了列舉活動,會在根活動上呼叫 GetActivities,然後再次以遞迴方式在每個傳回的活動上呼叫。 在下列範例中,會將活動樹狀中每個活動和運算式的 DisplayName 寫入至主控台。

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);
    }
}

這個範例程式碼會提供下列輸出。

清單項目 1
清單項目 2清單項目 3清單項目 4清單項目 5新增至集合的項目。序列常值<清單<字串>>
While
AddToCollection<String>
VariableValue<ICollection<String>>
LambdaValue<String>
LocationReferenceValue<List<String>>
LambdaValue<Boolean>
LocationReferenceValue<List<String>>
ForEach<String>
VariableValue<IEnumerable<String>>
WriteLine
DelegateArgumentValue<String>
序列
WriteLine
常值 <String> 擷取指定的活動而非列舉所有活動時,需使用 Resolve。 如果先前尚未呼叫過 ResolveGetActivitiesWorkflowInspectionServices.CacheMetadata 都會執行中繼資料快取。 如果已經呼叫過 CacheMetadata,則 GetActivities 會以現有的中繼資料為基礎。 因此,自上次呼叫 CacheMetadata 以來,如果樹狀結構進行過變更,GetActivities 可能會產生非預期的結果。 如果在呼叫 GetActivities 之後對工作流程進行變更,呼叫 ActivityValidationServices Validate 方法就能重新對中繼資料進行快取。 下一節將討論快取中繼資料。

快取中繼資料

快取活動的中繼資料會建置並驗證活動之引數、變數、子活動和活動委派的描述。 根據預設,中繼資料會在預備執行活動時由執行階段快取。 如果工作流程主機作者想要在此之前快取活動或活動樹狀的中繼資料,例如要預先取得成本,可以使用 CacheMetadata,在任何時間快取中繼資料。