Windows Workflow Foundation (WF) は、対話型の実行時間の長いアプリケーションを開発するための抽象化レベルを上げます。 作業単位はアクティビティとしてカプセル化されます。 アクティビティは、フロー制御、例外処理、障害伝達、状態データの永続化、メモリ、追跡、トランザクション フローからの進行中のワークフローの読み込みとアンロードのための機能を提供する環境で実行されます。
アクティビティ アーキテクチャ
アクティビティは、 Activity、 CodeActivity、 AsyncCodeActivity、または NativeActivityから派生する CLR 型、または値、 Activity<TResult>、 CodeActivity<TResult>、 AsyncCodeActivity<TResult>、または NativeActivity<TResult>を返すバリアントとして開発されます。 Activityから派生したアクティビティを開発すると、ユーザーは既存のアクティビティをアセンブルして、ワークフロー環境で実行される作業単位をすばやく作成できます。 CodeActivity一方、主にアクティビティ引数にアクセスするための CodeActivityContext を使用して、マネージド コードで実行ロジックを作成できます。 AsyncCodeActivity は CodeActivity に似ていますが、非同期タスクの実装に使用できる点が異なります。 NativeActivityから派生するアクティビティを開発すると、ユーザーは子のスケジュール設定、ブックマークの作成、非同期作業の呼び出し、トランザクションの登録などの機能をNativeActivityContextを介してランタイムにアクセスできます。
Activityから派生した作成アクティビティは宣言型であり、これらのアクティビティは XAML で作成できます。 次の例では、 Prompt
と呼ばれるアクティビティは、実行本文の他のアクティビティを使用して作成されます。
<Activity x:Class='Prompt'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
xmlns:z='http://schemas.microsoft.com/netfx/2008/xaml/schema'
xmlns:my='clr-namespace:XAMLActivityDefinition;assembly=XAMLActivityDefinition'
xmlns:s="clr-namespace:System;assembly=mscorlib"
xmlns="http://schemas.microsoft.com/2009/workflow">
<z:SchemaType.Members>
<z:SchemaType.SchemaProperty Name='Text' Type='InArgument(s:String)' />
<z:SchemaType.SchemaProperty Name='Response' Type='OutArgument(s:String)' />
</z:SchemaType.Members>
<Sequence>
<my:WriteLine Text='[Text]' />
<my:ReadLine BookmarkName='r1' Result='[Response]' />
</Sequence>
</Activity>
アクティビティ コンテキスト
ActivityContextは、ワークフロー ランタイムに対するアクティビティ作成者のインターフェイスであり、ランタイムの豊富な機能へのアクセスを提供します。 次の例では、実行コンテキストを使用してブックマークを作成するアクティビティが定義されています (アクティビティが、アクティビティにデータを渡すことで再開できる継続ポイントを実行に登録できるようにするメカニズム)。
public sealed class ReadLine : NativeActivity<string>
{
[RequiredArgument]
public InArgument<string> BookmarkName { get; set; }
protected override void Execute(NativeActivityContext context)
{
// Create a Bookmark and wait for it to be resumed.
context.CreateBookmark(BookmarkName.Get(context),
new BookmarkCallback(OnResumeBookmark));
}
// NativeActivity derived activities that do asynchronous operations by calling
// one of the CreateBookmark overloads defined on System.Activities.NativeActivityContext
// must override the CanInduceIdle property and return true.
protected override bool CanInduceIdle
{
get { return true; }
}
public void OnResumeBookmark(NativeActivityContext context, Bookmark bookmark, object obj)
{
// When the Bookmark is resumed, assign its value to
// the Result argument.
Result.Set(context, (string)obj);
}
アクティビティのライフ サイクル
アクティビティのインスタンスは、 Executing 状態で開始されます。 例外が発生しない限り、すべての子アクティビティの実行が完了し、その他の保留中の作業 (Bookmark オブジェクトなど) が完了し、その時点で Closed 状態に遷移するまで、この状態のままになります。 アクティビティ インスタンスの親は、子にキャンセルを要求できます。子を取り消すことができる場合は、 Canceled 状態で完了します。 実行時に例外がスローされた場合、ランタイムはアクティビティを Faulted 状態にし、アクティビティの親チェーンに例外を伝達します。 アクティビティの 3 つの完了状態を次に示します。
クローズド: アクティビティは作業を完了し、終了しました。
キャンセル: アクティビティは正常に作業を中止し、終了しました。 この状態に入った場合、作業は明示的にロールバックされません。
エラー: アクティビティでエラーが発生し、作業を完了せずに終了しました。
アクティビティが永続化またはアンロードされると、アクティビティは Executing 状態のままです。
.NET