自定义跟踪

CustomTracking 示例演示如何创建自定义跟踪参与者并将跟踪数据的内容写入控制台。 另外,此示例还演示如何发出使用用户定义的数据填充的 CustomTrackingRecord 对象。 基于控制台的跟踪参与者将使用代码中创建的跟踪配置文件对象来筛选由工作流发出的 TrackingRecord 对象。

示例详细信息

Windows Workflow Foundation (WF) 提供一个跟踪基础结构,用于跟踪工作流实例的执行。 跟踪运行时实现一个工作流实例,以便发出与工作流生命周期有关的事件、来自工作流活动的事件和自定义跟踪事件。 下表详细介绍了跟踪基础结构的主要组件。

组件 描述
跟踪运行时 提供基础结构以发出跟踪记录。
跟踪参与者 使用跟踪记录。 .NET Framework 4 附带了一个跟踪参与者,它作为 Windows 跟踪记录 (ETW) 事件写入跟踪记录。
跟踪配置文件 筛选机制,允许跟踪参与者订阅从工作流实例发出的跟踪记录的子集。

下表详细介绍工作流运行时发出的跟踪记录。

跟踪记录 描述
工作流实例跟踪记录。 描述工作流实例的生命周期。 例如,当工作流启动或完成时发出一个实例记录。
活动状态跟踪记录。 详细说明活动执行情况。 这些记录指示工作流活动的状态,例如,当安排活动时、活动完成时或引发错误时。
书签恢复记录。 当恢复工作流实例中的书签时发出。
自定义跟踪记录。 工作流作者可以在自定义活动中创建并发出自定义跟踪记录。

跟踪参与者使用跟踪配置文件来订阅已发出 TrackingRecord 对象的子集。 跟踪配置文件包含允许订阅特定跟踪记录类型的跟踪查询。 可以在代码或配置中指定跟踪配置文件。

自定义跟踪参与者

跟踪参与者 API 允许以用户提供的跟踪参与者扩展跟踪运行时,该用户提供的跟踪参与者可包括用于对工作流运行时发出的 TrackingRecord 对象进行处理的自定义逻辑。

若要编写跟踪参与者,用户必须实现 TrackingParticipant。 具体而言,Track 方法必须由自定义参与者实现。 此方法在工作流运行时发出 TrackingRecord 时调用。

public abstract class TrackingParticipant
{
    protected TrackingParticipant();

    public virtual TrackingProfile TrackingProfile { get; set; }
    public abstract void Track(TrackingRecord record, TimeSpan timeout);
}

完整的跟踪参与者是在 ConsoleTrackingParticipant.cs 文件中实现的。 下面的代码示例是用于自定义跟踪参与者的 Track 方法。

protected override void Track(TrackingRecord record, TimeSpan timeout)
{
    ...
    WorkflowInstanceRecord workflowInstanceRecord = record as WorkflowInstanceRecord;
    if (workflowInstanceRecord != null)
    {
        Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
            " Workflow InstanceID: {0} Workflow instance state: {1}",
            record.InstanceId, workflowInstanceRecord.State));
    }

    ActivityStateRecord activityStateRecord = record as ActivityStateRecord;
    if (activityStateRecord != null)
    {
        IDictionary<String, object> variables = activityStateRecord.Variables;
        StringBuilder vars = new StringBuilder();

        if (variables.Count > 0)
        {
            vars.AppendLine("\n\tVariables:");
            foreach (KeyValuePair<string, object> variable in variables)
            {
                vars.AppendLine(String.Format(
                    "\t\tName: {0} Value: {1}", variable.Key, variable.Value));
            }
        }
        Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
            " :Activity DisplayName: {0} :ActivityInstanceState: {1} {2}",
                activityStateRecord.Activity.Name, activityStateRecord.State,
            ((variables.Count > 0) ? vars.ToString() : String.Empty)));
    }

    CustomTrackingRecord customTrackingRecord = record as CustomTrackingRecord;

    if ((customTrackingRecord != null) && (customTrackingRecord.Data.Count > 0))
    {
        ...
    }
    Console.WriteLine();

}

下面的代码示例将向工作流调用程序添加控制台参与者。

ConsoleTrackingParticipant customTrackingParticipant = new ConsoleTrackingParticipant()
{
    ...
    // The tracking profile is set here, refer to Program.CS
...
}

WorkflowInvoker invoker = new WorkflowInvoker(BuildSampleWorkflow());
invoker.Extensions.Add(customTrackingParticipant);

发出自定义跟踪记录

此示例还演示从自定义工作流活动发出 CustomTrackingRecord 对象的功能:

下面的示例演示如何发出自定义活动内的 CustomTrackingRecord 对象。

// Create the Custom Tracking Record
CustomTrackingRecord customRecord = new CustomTrackingRecord("OrderIn")
{
    Data =
    {
        {"OrderId", 200},
        {"OrderDate", "20 Aug 2001"}
    }
};

// Emit custom tracking record
context.Track(customRecord);

使用此示例

  1. 使用 Visual Studio 打开 CustomTrackingSample.sln 解决方案文件。

  2. 要生成解决方案,按 Ctrl+Shift+B。

  3. 若要运行解决方案,请按 Ctrl+F5。

另请参阅