スレッド ローカル ストレージ (TLS) を通じて、CLR は各スレッドの実行コンテキストを維持します。 この実行コンテキストは、名前付きスロットなどのユーザー定義のスレッド プロパティに加えて、スレッド ID、アンビエント トランザクション、現在のアクセス許可セットなどの既知のスレッド プロパティを管理します。
CLR を直接対象とするプログラムとは異なり、ワークフロー プログラムは、スレッドに依存しない環境で実行されるアクティビティの階層スコープ ツリーです。 これは、標準の TLS メカニズムを直接使用して、特定の作業項目のスコープ内のコンテキストを判断できないことを意味します。 たとえば、2 つの並列実行分岐で異なるトランザクションが使用される場合でも、スケジューラは同じ CLR スレッドで実行をインターリーブできます。
ワークフロー実行プロパティは、アクティビティの環境にコンテキスト固有のプロパティを追加するメカニズムを提供します。 これにより、アクティビティはサブツリーのスコープ内にあるプロパティを宣言できます。また、CLR オブジェクトと適切に相互運用できるように TLS を設定および破棄するためのフックも提供します。
ワークフロー実行プロパティの作成と使用
ワークフロー実行プロパティは通常、 IExecutionProperty インターフェイスを実装しますが、メッセージングに重点を置いたプロパティでは、代わりに ISendMessageCallback と IReceiveMessageCallback を実装できます。 ワークフロー実行プロパティを作成するには、 IExecutionProperty インターフェイスを実装し、 SetupWorkflowThread および CleanupWorkflowThreadメンバーを実装するクラスを作成します。 これらのメンバーは、プロパティを含むアクティビティおよびその子アクティビティの作業の各サイクル中に、スレッド ローカル ストレージを適切に設定し、破棄するための機会を実行プロパティに提供します。 この例では、ConsoleColorProperty
を設定するConsole.ForegroundColor
が作成されます。
class ConsoleColorProperty : IExecutionProperty
{
public const string Name = "ConsoleColorProperty";
ConsoleColor original;
ConsoleColor color;
public ConsoleColorProperty(ConsoleColor color)
{
this.color = color;
}
void IExecutionProperty.SetupWorkflowThread()
{
original = Console.ForegroundColor;
Console.ForegroundColor = color;
}
void IExecutionProperty.CleanupWorkflowThread()
{
Console.ForegroundColor = original;
}
}
アクティビティの作成者は、このプロパティをアクティビティの実行オーバーライドに登録することで使用できます。 この例では、現在のConsoleColorScope
のConsoleColorProperty
コレクションに追加してPropertiesを登録するNativeActivityContext アクティビティを定義します。
public sealed class ConsoleColorScope : NativeActivity
{
public ConsoleColorScope()
: base()
{
}
public ConsoleColor Color { get; set; }
public Activity Body { get; set; }
protected override void Execute(NativeActivityContext context)
{
context.Properties.Add(ConsoleColorProperty.Name, new ConsoleColorProperty(this.Color));
if (this.Body != null)
{
context.ScheduleActivity(this.Body);
}
}
}
アクティビティの本文が作業サイクルを開始すると、プロパティの SetupWorkflowThread メソッドが呼び出され、作業サイクルが完了すると、CleanupWorkflowThread が呼び出されます。 この例では、3 つの分岐を持つ Parallel アクティビティを使用するワークフローが作成されます。 最初の 2 つのブランチは ConsoleColorScope
アクティビティを使用し、3 番目のブランチは使用しません。 3 つのブランチには、2 つの WriteLine アクティビティと 1 つの Delay アクティビティが含まれています。
Parallel アクティビティが実行されると、分岐に含まれるアクティビティはインターリーブ方式で実行されますが、各子アクティビティが実行されると、ConsoleColorProperty
によって正しいコンソールの色が適用されます。
Activity wf = new Parallel
{
Branches =
{
new ConsoleColorScope
{
Color = ConsoleColor.Blue,
Body = new Sequence
{
Activities =
{
new WriteLine
{
Text = "Start blue text."
},
new Delay
{
Duration = TimeSpan.FromSeconds(1)
},
new WriteLine
{
Text = "End blue text."
}
}
}
},
new ConsoleColorScope
{
Color = ConsoleColor.Red,
Body = new Sequence
{
Activities =
{
new WriteLine
{
Text = "Start red text."
},
new Delay
{
Duration = TimeSpan.FromSeconds(1)
},
new WriteLine
{
Text = "End red text."
}
}
}
},
new Sequence
{
Activities =
{
new WriteLine
{
Text = "Start default text."
},
new Delay
{
Duration = TimeSpan.FromSeconds(1)
},
new WriteLine
{
Text = "End default text."
}
}
}
}
};
WorkflowInvoker.Invoke(wf);
ワークフローが呼び出されると、次の出力がコンソール ウィンドウに書き込まれます。
Start blue text.
Start red text.
Start default text.
End blue text.
End red text.
End default text.
注
前の出力には表示されませんが、コンソール ウィンドウのテキストの各行は、指定された色で表示されます。
ワークフロー実行プロパティは、カスタム アクティビティ作成者が使用できます。また、 CorrelationScope や TransactionScope アクティビティなどのアクティビティの処理管理のメカニズムも提供します。
こちらも参照ください
.NET