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的track方法,會發出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);
若要使用此範例
使用 Visual Studio 開啟CustomTrackingSample.sln方案檔。
若要建置此方案,請按 CTRL+SHIFT+B。
若要執行解決方案,請按 CTRL+F5。