自定义跟踪

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

示例详细信息

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

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

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

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

跟踪参与者使用跟踪配置文件来订阅已发出 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。

另请参阅