如何:对工作流应用工作流更改
动态更改正在运行的工作流实例的能力符合典型的人工工作流方案的要求。 例如,一个设置了四个面视官的面视工作流在运行时可能会进行更改,以添加第五个步骤来获取有关候选人的其他方面的考察的新信息。
这些工作流更改可以从工作流的执行线程内部和外部应用到正在运行的工作流实例。 在内部,通常是通过使用活动的事件处理程序来应用更改,或直接将更改应用到自定义活动的执行逻辑。 在外部,可以使用宿主应用程序中的 Windows Workflow Foundation API 来访问工作流并进行必要的更改。 为了确保工作流更改应用正确,宿主应该只在工作流实例处于挂起状态或保证处于空闲状态时应用工作流更改。
备注
工作流更改对于给定的工作流类型并非永久性更改,将不会传播到该类型将来的实例。
在工作流中创作
Windows Workflow Foundation 提供了 WorkflowChanges 类以方便在工作流中进行工作流更改。 可通过复合活动的 Add 方法添加活动,该复合活动将成为新添加的活动的父级。 相反,通过其父级复合活动的 Remove 方法可以移除一个活动。 这些更改在瞬态类中成批处理。
当执行工作流更改时,可以取消 Validate 方法。 Validate 方法将对活动图形执行语义检查,以确保在内存中锁定活动图形之前运行时语义的正确性。 然后可以从 WorkflowInstance 对象调用 ApplyWorkflowChanges 方法,并传递 WorkflowChanges 对象作为任何数量的相同工作流类型的参数。 但是,对于给定的瞬态类,只能在一个实例上调用一次 ApplyWorkflowChanges 方法。
下面的代码示例演示了如何使用 WorkflowChanges 类将更改添加到工作流实例。
InvokeWorkflowActivity invokeNewWorkflow = new InvokeWorkflowActivity();
WorkflowChanges changes = new WorkflowChanges(this);
//
// NewWorkflow type
//
Type type = typeof(Workflow1);
invokeNewWorkflow.Name = "NewWorkflow";
invokeNewWorkflow.TargetWorkflow = type;
//
// Add NewWorkflow after delay.
//
DelayActivity delay = changes.TransientWorkflow.Activities["delay1"] as DelayActivity;
delay.Parent.Activities.Add(invokeNewWorkflow);
//
// Apply transient changes to instance.
//
this.ApplyWorkflowChanges(changes);
由于工作流的多个实例共享相同的活动树,因此,当发生动态更改时,将克隆活动树来进行更改,而其余的实例将继续共享原始的活动树。
从宿主环境中进行创作
WorkflowInstance 类公开 ApplyWorkflowChanges 方法以支持从工作流外部创作动态更改。 此方法大多数时间由宿主环境使用。
若要从宿主环境中将工作流更改应用到正在运行的工作流实例,请定位到要在其中进行工作流更改的实例并获取该实例的 WorkflowInstance。 运行库将针对每个工作流实例化创建一个 WorkflowInstance。 当调用 CreateWorkflow 时,宿主可以通过保存返回参数来获取工作流的 WorkflowInstance。
获取 WorkflowInstance 对象之后,创建一个 WorkflowChanges 对象并使用该对象的不同方法和属性来应用工作流更改。 执行此操作时,宿主使用的是 WorkflowInstance 的副本。 若要将工作流更改应用到当前正执行的 WorkflowInstance,请从 WorkflowInstance 对象调用 ApplyWorkflowChanges 方法。
有关从宿主动态更新工作流的示例,请参见Workflow Changes From Host。
工作流更改和活动属性
按如下所示设置瞬态工作流活动上的属性:
对于元数据属性,在应用更新之后,在瞬态工作流上设置的值将在正运行的工作流上生效。
对于实例属性,在瞬态工作流上设置的值将会在应用更新之后丢失, 而保留原来运行的工作流值。
请参见
参考
WorkflowChanges
WorkflowInstance
WorkflowRuntime
概念
其他资源
版权所有 (C) 2007 Microsoft Corporation。保留所有权利。