WWF Hello World!!の作成

Windows Workflow Foundationをキャッチアップするにあたって、
いつものようにHello Worldプログラムを作成してみました。

1. Sequential Workflow Console Applicationプロジェクトの作成
Workflowのプロジェクトはいくつも種類がありますが、
まずはこのSequetial Workflowが基本になるみたいです。
Workflowをコンソールから起動するプロジェクトになります。
簡単に動かしてみるには、うってつけのプロジェクトですね。

2. Workflow1.csに、ToolboxからCode アクティビティをドラッグ&ドロップ
プロジェクトを開くと、Workflow1.csのワークフローデザイン画面が開きます。
開始と終了のアクティビティの間に、Codeアクティビティをドラッグ&ドロップで追加します。
このアクティビティは任意のコードを実行するためのアクティビティになります。

3. Code アクティビティをダブルクリックし、コードを記述
Codeアクティビティにワークフローが進んだときに処理されるコードを記述します。
アクティビティをダブルクリックすると自動的にイベントハンドラが生成されるので、
今回は下記のようにコードを記述してみました。ありがちなサンプルです(^^;;

        private void code1_ExecuteCode(object sender, EventArgs e)
        {
            System.Console.WriteLine("Hello World!!");
        }

4. Code Activityにブレークポイントを設定
ワークフローのデザインモードに戻って、Codeアクティビティにブレークポイントを設定します。
アクティビティを右クリックし、「Break Point -> Insert Break Point」を選択します。
3.で実装したイベントハンドラに直接ブレークポイントを設定しても構いません。

5. デバッグ実行
VSをデバッグ実行すると、コンソールが開いてワークフローが実行されます。
F10でステップ実行し、ワークフローが完了するとコンソールに"Hello World!!"という
文字列が出力されます。

6. Workflow制御のコードを確認
このままではあまり意味がないので、ワークフローを起動しているコードを確認します。
デフォルトで生成される、Program.csにそのコードがあります。

        static AutoResetEvent waitHandle = new AutoResetEvent(false);

        static void Main(string[] args)
        {
            WorkflowRuntime workflowRuntime = new WorkflowRuntime();
            workflowRuntime.StartRuntime();

            workflowRuntime.WorkflowCompleted += OnWorkflowCompleted;

            Type type = typeof(HelloWorldWorkflow.Workflow1);
            workflowRuntime.StartWorkflow(type);

            waitHandle.WaitOne();

            workflowRuntime.StopRuntime();
        }

        static void OnWorkflowCompleted(object sender, WorkflowCompletedEventArgs e)
        {
            waitHandle.Set();
        }

ワークフローが完了したときのイベントハンドラ
指定できるところなどがいけてますね。
それと大事なのが、ワークフローのインスタンス
いろんな実行環境にホストできる点です。
今回のサンプルはコンソールアプリですが、
WindowsフォームやWindowsサービスなどにもホストできます。

最後に、ワークフローをちょっと触ってみた感想です。
基本的な動きは、BizTalkのワークフローと同じと考えても大丈夫ですが、
アーキテクチャがより洗練されているのと、
イベント駆動など新しい考えも盛り込まれていて、非常に面白いです。
いろんな実行環境にホストできるので、かなり用途は広い気がしています。
これはBizTalkのオーケストレーションでは実現できないことでした。

まだまだ触り始めたばかりです。これからもっと深くまで掘り下げようと思います。