Windows Workflow のアーキテクチャ

Windows Workflow Foundation (WF) により、実行時間の長い対話型アプリケーションの開発における抽象化のレベルが引き上げられます。 作業単位はアクティビティとしてカプセル化されます。 アクティビティが実行される環境には、フロー制御、例外処理、エラー伝達、状態データの永続化、動作中のワークフローのメモリへの読み込みやアンロード、追跡、トランザクション フローに対応する機能が備わっています。

アクティビティのアーキテクチャ

アクティビティは、ActivityCodeActivityAsyncCodeActivity、または NativeActivity から派生する CLR 型として開発されたり、値 Activity<TResult>CodeActivity<TResult>AsyncCodeActivity<TResult>、または NativeActivity<TResult> を返す CLR 型の変化形として開発されます。 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 つの完了状態を次に示します。

  • Closed: アクティビティは作業を完了し、終了しました。

  • Canceled: アクティビティは作業を正常に中断し、終了しました。 この状態に移行した場合、作業は明示的にロール バックされません。

  • Faulted: アクティビティによってエラーが検出され、作業が完了されずに終了しました。

アクティビティは、永続化またはアンロードされても Executing 状態を維持します。