WF4.0 追蹤系統由三大核心組件構成:追蹤記錄 (記錄事件)、追蹤配置檔 (篩選規則)、追蹤參與者 (處理輸出)。掌握此機制可建立完整的工作流監控、稽核與診斷體系。
TrackingRecord (抽象基類) - 內建記錄類型:
WorkflowInstanceRecord:工作流實例生命週期事件ActivityStateRecord:活動狀態變更 (Executing, Closed, Faulted...)CustomTrackingRecord:活動內自訂記錄 (context.Track())TrackingProfile - 定義查詢條件:

ActivityStateQuery:活動狀態、變數/參數擷取 (States、Variables、Arguments)WorkflowInstanceQuery:工作流實例狀態 (States 含 Started, Completed, Idle, Persisted...)CustomTrackingQuery:自訂記錄篩選 (Name、ActivityName)TrackingParticipant (抽象) - 覆寫 Track(TrackingRecord, TimeSpan) 處理記錄。
1. 自訂參與者類別 - 解析三種記錄類型並格式化輸出至 Console:
public class MyTrackingParticipant : TrackingParticipant
{
protected override void Track(TrackingRecord record, TimeSpan timeout)
{
// 共同欄位
Console.Write($"{Name} emitted: {record.GetType().Name} Level:{record.Level} #{record.RecordNumber}");
// WorkflowInstanceRecord
if (record is WorkflowInstanceRecord wir)
Console.Write($" InstanceId:{wir.InstanceId} State:{wir.State}");
// ActivityStateRecord
if (record is ActivityStateRecord asr) {
var vars = asr.Variables;
if (vars.Count > 0) {
Console.Write("\n\tVariables:");
foreach (var v in vars) Console.Write($"\n\t\t{v.Key}={v.Value}");
}
Console.Write($"\n Activity:{asr.Activity.Name} State:{asr.State}");
}
// CustomTrackingRecord
if (record is CustomTrackingRecord ctr && ctr.Data.Count > 0) {
Console.Write("\n\tUser Data:");
foreach (var d in ctr.Data) Console.Write($"\n\t\t{d.Key}={d.Value}");
}
Console.WriteLine();
}
}
2. 定義追蹤配置檔 - 訂閱所有活動狀態、所有工作流實例狀態、所有自訂記錄:
public static TrackingParticipant GetTracking()
{
var profile = new TrackingProfile { Name = "DemoProfile" };
profile.Queries.Add(new CustomTrackingQuery { Name = "*", ActivityName = "*" });
profile.Queries.Add(new WorkflowInstanceQuery { States = { "*" } });
profile.Queries.Add(new ActivityStateQuery { ActivityName = "*", States = { "*" }, Variables = { "*" }, Arguments = { "*" } });
var participant = new MyTrackingParticipant { TrackingProfile = profile };
return participant;
}
3. 具備 CustomTrackingRecord 的活動:
public sealed class MyActivity : CodeActivity
{
protected override void Execute(CodeActivityContext context)
{
Console.WriteLine("MyActivity Execute");
var record = new CustomTrackingRecord("MyActivity_CustomRecord");
record.Data.Add("wxd", 12345);
record.Data.Add("wxwinter", "lzm");
context.Track(record);
}
}
工作流設計:
宿主註冊:
var app = new WorkflowApplication(new TestWorkflow());
app.Extensions.Add(MyTrackingTools.GetTracking());
app.Run();
Console 輸出結果:
EtwTrackingParticipant 將記錄寫入 Windows 事件追蹤 (ETW),配合 AppFabric 等工具可將資料持久化至 SQL 資料庫,供企業級監控儀表板使用。