次の方法で共有


カスタム追跡

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 キーを押します。

こちらも参照ください