共用方式為


活動樹狀結構檢查

本主題僅適用於 Windows Workflow Foundation 4。

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

使用 WorkflowInspectionServices

GetActivities 方法用於列舉指定活動樹狀結構中的所有活動。GetActivities 會傳回可列舉項目,此項目會接觸樹狀結構中的所有活動,包括子系、委派處理常式、變數預設值,以及引數運算式。 在下列範例中,工作流程定義是使用 SequenceWhileForEachWriteLine 和運算式所建立。 建立工作流程定義之後,就會叫用該工作流程,然後呼叫 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
項目已加入至集合。
Sequence
  Literal<List<String>>
  While
    AddToCollection<String>
      VariableValue<ICollection<String>>
      LambdaValue<String>
        LocationReferenceValue<List<String>>
    LambdaValue<Boolean>
      LocationReferenceValue<List<String>>
  ForEach<String>
    VariableValue<IEnumerable<String>>
    WriteLine
      DelegateArgumentValue<String>
  Sequence
    WriteLine
      Literal<String>

為了擷取指定的活動而非列舉所有活動,會使用 Resolve。 如果先前尚未呼叫過 WorkflowInspectionServices.CacheMetadataResolveGetActivities 都會執行中繼資料快取。 如果已經呼叫過 CacheMetadata,則 GetActivities 會以現有的中繼資料為基礎。 因此,自上次呼叫 CacheMetadata 以來,如果樹狀結構進行過變更,GetActivities 可能會產生非預期的結果。 如果在呼叫 GetActivities 之後對工作流程進行變更,可以透過呼叫 ActivityValidationServices Validate 方法的方式重新快取中繼資料。 下一節將討論快取中繼資料。

快取中繼資料

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