Windows Workflow Foundation (WF) 的動態更新功能允許在工作流實例運行期間修改其結構(增刪活動、修改屬性/規則),且僅影響當前實例,不影響定義與未來實例。適用于緊急插入審批節點、臨時變更路由等場景。
僅在以下宿主事件中可安全執行動態更新:
WorkflowCreated:實例創建完成,未啟動。WorkflowSuspended:實例掛起未恢復。WorkflowIdled:實例空閒(如等待 DelayActivity 或外部事件)。WorkflowChanges 對象,傳入根活動(內部用 this,外部用 workflowInstance.GetWorkflowDefinition())。TransientWorkflow 克隆副本,在其上修改(如 CompositeActivity.Activities.Add())。Validate() 驗證,無錯誤則調用 ApplyWorkflowChanges() 應用到運行中實例。static void workflowRuntime_WorkflowCreated(object sender, WorkflowEventArgs e)
{
var wc = new WorkflowChanges(e.WorkflowInstance.GetWorkflowDefinition());
var container = wc.TransientWorkflow.GetActivityByName("sequenceActivityContainer") as CompositeActivity;
if (container != null)
{
container.Activities.Add(new PrintActivity());
var errors = wc.Validate();
if (errors.Count == 0)
e.WorkflowInstance.ApplyWorkflowChanges(wc);
else
foreach (var err in errors) Console.WriteLine(err);
}
}
設置工作流的 DynamicUpdateCondition 屬性為 false 或綁定條件表達式,若評估為 false 則拋出異常阻止更新。