次の方法で共有


方法 : ワークフローの変更箇所をワークフローに適用する

人間が考えるワークフロー シナリオでは、実行中のワークフロー インスタンスを動的に変更する機能がしばしば使われます。たとえば、4 人の面接官が面接を行うワークフローの場合、新たな情報が明らかになり、さらに別の観点から応募者を選考する必要が生じたときは、実行時に 5 番目の手順を追加します。

ワークフローの実行スレッドの内側および外側から、実行中のワークフロー インスタンスにこのようなワークフロー変更を適用できます。内側から変更を適用するには通常、アクティビティのイベント ハンドラを使用するか、カスタム アクティビティの実行ロジックの中に直接適用します。外側からは、ホスト アプリケーションで Windows Workflow Foundation API を使ってワークフローにアクセスし、必要な変更を行うことができます。ワークフローの変更を正しく適用するには、ワークフロー インスタンスが中断状態またはアイドル状態であることが確認できる場合にのみ、ホストは変更を適用する必要があります。

Noteメモ :

特定のワークフロー型では、ワークフロー変更は永続的な変更ではなく、そのタイプの将来のインスタンスには変更が伝達されません。

ワークフロー内での作成

Windows Workflow Foundation の WorkflowChanges クラスを使用すれば、ワークフロー内でワークフローを変更することができます。アクティビティを追加するには、その新しいアクティビティの親となる複合アクティビティの Add メソッドを使用します。逆に、アクティビティを削除するには、親である複合アクティビティの Remove メソッドを使用できます。これらの変更は、一時的なクラスの中でバッチ処理されます。

ワークフローの変更を実行するときには、Validate メソッドを呼び出すことができます。Validate メソッドは、セマンティックの正しさを検証するためにアクティビティ グラフに対するセマンティック チェックをランタイムで実行した後、メモリ内でそれをロックします。その後、ApplyWorkflowChanges メソッドを WorkflowInstance オブジェクトから呼び出すことができます。その際、同じワークフロー型の任意の数のインスタンスに関するパラメータとして WorkflowChanges オブジェクトを渡すことができます。ただし、特定の一時的クラスごとに、1 つのインスタンスに対して 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);

1 つのワークフローの複数のインスタンスは同じアクティビティ ツリーを共有するため、動的変更の際にはアクティビティ ツリーが変更用に複製され、残りのインスタンスは元のアクティビティ ツリーを共有し続けます。

ホスト環境からの作成

WorkflowInstance クラスは、ワークフロー外部からの動的変更を可能にするために ApplyWorkflowChanges メソッドを公開します。ほとんどの場合、このメソッドはホスト環境によって使用されます。

実行中のワークフロー インスタンスにホスト環境からワークフロー変更を適用するには、ワークフロー変更対象のインスタンスまで移動して、その WorkflowInstance を取得します。ランタイムは、ワークフローの各インスタンスに WorkflowInstance を作成します。ホストは、CreateWorkflow の呼び出し時に返されるパラメータを保存することにより、ワークフローの WorkflowInstance を取得できます。

WorkflowInstance オブジェクトを取得した後、WorkflowChanges オブジェクトを作成し、そのオブジェクトのさまざまなメソッドやプロパティを使ってワークフロー変更を適用します。このとき、ホストは WorkflowInstance のコピーを操作しています。現在実行中の WorkflowInstance にワークフロー変更を適用するには、ApplyWorkflowChanges メソッドを WorkflowInstance オブジェクトから呼び出します。

ホストからワークフローを動的に更新する例については、「Workflow Changes From Host」を参照してください。

ワークフロー変更とアクティビティ プロパティ

一時的なワークフロー アクティビティのプロパティを設定すると、次のように動作します。

  • メタデータ プロパティの場合、一時的ワークフローで設定された値は、更新適用後に実行中のワークフローで有効になります。

  • インスタンス プロパティの場合、一時的ワークフローで設定された値は、更新適用後に失われます。元の実行中のワークフローの値が保持されます。

関連項目

参照

WorkflowChanges
WorkflowInstance
WorkflowRuntime

概念

ワークフローでのワークフロー変更の使用

その他の技術情報

ワークフロー対応アプリケーションの開発

Footer image

Copyright © 2007 by Microsoft Corporation.All rights reserved.