Windows Workflow Foundation (WF) 的動態更新允許在工作流實例執行期間修改其結構:新增/刪除活動、變更屬性、調整規則條件。關鍵特性:
WF 執行緒為單一執行緒模型,為避免競態條件,僅允許在以下三種狀態執行更新:
WorkflowRuntime.WorkflowCreated 事件WorkflowRuntime.WorkflowSuspended 事件(可用 SuspendActivity 觸發)WorkflowRuntime.WorkflowIdled 事件(DelayActivity、HandleExternalEventActivity 會進入閒置)GetWorkflowDefinition(),內部用 this)TransientWorkflow 屬性取得複本,使用 GetActivityByName 或 Activities 集合尋找父活動Add、Insert、Remove 方法新增/插入/移除活動Validate(),檢查 ValidationErrorCollectionWorkflowInstance.ApplyWorkflowChanges(),內部呼叫 this.ApplyWorkflowChanges()在工作流設計器中設定 DynamicUpdateCondition 屬性(型別為 RuleConditionReference 或程式碼條件)。評估為 false 時,ApplyWorkflowChanges 會拋出 InvalidOperationException。
public sealed partial class CaryDynamicUpdateWorkflow : SequentialWorkflowActivity
{
public CaryDynamicUpdateWorkflow() { InitializeComponent(); }
private void beforeSequence_ExecuteCode(object sender, EventArgs e)
{ Console.WriteLine("beforeSequence執行了"); }
private void afterSequence_ExecuteCode(object sender, EventArgs e)
{ Console.WriteLine("afterSequence執行了"); }
private void IsUpdate(object sender, ConditionalEventArgs e)
{ e.Result = true; } // 條件永真,觸發動態更新
}
public partial class PrintActivity : Activity
{
public PrintActivity() { InitializeComponent(); }
protected override ActivityExecutionStatus Execute(ActivityExecutionContext context)
{
Console.WriteLine("自定義 Print活動");
return base.Execute(context);
}
}
class Program
{
static void Main()
{
using (WorkflowRuntime runtime = new WorkflowRuntime())
{
runtime.WorkflowCreated += Runtime_WorkflowCreated;
WorkflowInstance instance = runtime.CreateWorkflow(typeof(CaryDynamicUpdateWorkflow));
instance.Start();
Console.ReadLine();
}
}
static void Runtime_WorkflowCreated(object sender, WorkflowEventArgs e)
{
WorkflowChanges wc = new WorkflowChanges(e.WorkflowInstance.GetWorkflowDefinition());
CompositeActivity container = wc.TransientWorkflow.GetActivityByName("sequenceActivityContainer") as CompositeActivity;
if (container != null)
{
container.Activities.Add(new PrintActivity());
ValidationErrorCollection errors = wc.Validate();
if (errors.Count == 0)
{
try { e.WorkflowInstance.ApplyWorkflowChanges(wc); }
catch (Exception ex) { Console.WriteLine($"異常:{ex.Message}"); }
}
}
}
}

設計器中 sequenceActivityContainer 為 SequenceActivity,動態更新時將 PrintActivity 插入其子活動集合。
CompositeActivity、屬性繫結是否完整TransientWorkflow 操作而非原始定義