Поделиться через


Настраиваемое отслеживание

В примере 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 создаются и заполняются определяемыми пользователем данными, которые должны быть переданы вместе с записью.

  • CustomTrackingRecord испускается путем вызова метода отслеживания ActivityContext.

В следующем примере показано, как выдавать 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. Откройте файл решения CustomTrackingSample.sln с помощью Visual Studio.

  2. Для построения решения нажмите CTRL+SHIFT+B.

  3. Чтобы запустить решение, нажмите клавиши CTRL+F5.

См. также