SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Vista時代のプログラミングモデル .NET Framework 3.0入門

WF(Windows Workflow Foundation)チュートリアル 前編

Vista時代のプログラミングモデル .NET Framework 3.0入門 (5)


  • X ポスト
  • このエントリーをはてなブックマークに追加

WFが提供するアクティビティ群

 では早速、WFを使ってワークフローを実行…したいところですが、まずはWFの準備するアクティビティ群について確認しておきましょう。

 Visual Studio 2005 Extensions for WFがインストールされていれば、WFで使用できるアクティビティとして、次のようなツールボックスが表示されるはずです。

アクティビティ ツールボックス
アクティビティ ツールボックス

 代表的なアクティビティについて、概要を示します。

アクティビティ概要
アクティビティ概要
CallExternalMethod外部のメソッドを呼び出す
Codeコードを実行する
CompensatableSequenceエラーが発生した場合に補正処理を実行する
ConditionedActivityGroup条件を満たすまで処理を行う
Delay指定時間実行を遅延させる
EventDrivenイベント発生時に処理を行う
IfElse条件に基づいてIf~Then~Else処理を行う
InvokeWebServiceWebサービスを実行する
InvokeWorkflow他のワークフローを実行する
Parallel複数のアクティビティを並列実行する
SetStateステートマシンワークフローで状態を遷移させる
Sequence複数のアクティビティを連続して実行する
Stateステートマシンワークフローの状態を定義する
StateInitialization他の状態から遷移してきたときに処理を行う
StateFinalization他の状態に遷移するときに処理を行う
Suspendワークフローの実行を中断する
SynchronizationScopeワークフロー内で共有データにアクセスする部分を指定する
Terminateワークフローの実行を終了する
Throw例外を送出する
TransactionScopeトランザクション対象の部分を指定する
WebServiceInputWebサービスとして公開されたワークフローでリクエストを受信する
WebServiceOutputWebサービスとして公開されたワークフローでレスポンスを送信する
While条件を満たす限り処理を行う

 これらのアクティビティを組み合わせてワークフローを作成していきます。

シーケンシャル ワークフローによるサンプル

 では、早速シーケンシャル ワークフローによるサンプルを作成してみましょう。

最初の一歩~Codeアクティビティ

 Visual Studio 2005を起動し、新しいプロジェクトを作成します。Visual Studio 2005 Extensions for WFが正しくインストールされていれば、プロジェクトの種類として[Workflow]というカテゴリが追加されているはずです。今回は[シーケンシャル ワークフロー コンソール アプリケーション]を選択し、「WFSequenceSample」という名前でプロジェクトを作成します。

プロジェクト カテゴリの不思議
 WPF/WCFのプロジェクトは[.NET Framework 3.0]というカテゴリなのですが、WFのプロジェクトだけは[Workflow]に分類されています。
 WPF/WCFのExtensionsがベータ版であることの影響でしょうか。
新しいプロジェクトの選択
新しいプロジェクトの選択
プロジェクト作成時に生成されるファイル
ファイル名概要
Workflow1.csワークフロークラスファイル。イベントハンドラやユーザー定義プロパティなどを記述する
Workflow1.designer.csVisual Studioがワークフロー上に配置したコントロールの関係などを記録するためのファイル。Workflow1.csのパーシャルクラス
Workflow1.rulesワークフローで使用したルール条件(後述)を保存するXMLファイル
Program.csワークフローを実行するためのクラスファイル

 新しいプロジェクトを作成すると、自動的にシーケンシャルワークフローのひな型が定義されます。

シーケンシャルワークフローひな型
シーケンシャルワークフローひな型

 開始アイコンから終了アイコンへとフローが流れていくイメージです。

 では、最初にCodeアクティビティをツールボックスからワークフローにドラッグ&ドロップしてみましょう。"アクティビティをドロップしてシーケンシャル ワークフローを作成します"という部分にドロップしてください。

Codeアクティビティを配置
Codeアクティビティを配置

 ドロップしたCodeアクティビティをダブルクリックすると自動的にcodeActivity1_ExecuteCodeというメソッドが作成されます。お約束通り、Hello Worldを書き込みましょう。

Workflow1.cs Codeアクティビティ
private void codeActivity1_ExecuteCode(object sender, EventArgs e)
{
    Console.WriteLine("Hello WF World!");
    Console.ReadKey();
}

 [F5]キーを押して実行しましょう。

実行結果
実行結果

 無事メッセージがコンソールに出力されるはずです。何かキーを押すと終了します。

ワークフローはどのように実行されているのか

 あまりにあっけない結果ではありましたが、生成されたコードを確認してみましょう。

 「Workflow1.cs」を見ると、コンストラクタと、先ほど作成したCodeアクティビティで実行するコードがあるだけです。ワークフローを実行するためのコードは「Program.cs」にあるようです。

Program.cs
static void Main(string[] args)
{
    using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
    {
        AutoResetEvent waitHandle = new AutoResetEvent(false);
        workflowRuntime.WorkflowCompleted +=
            delegate(object sender, WorkflowCompletedEventArgs e)
            {waitHandle.Set();};
        workflowRuntime.WorkflowTerminated +=
            delegate(object sender, WorkflowTerminatedEventArgs e)
        {
            Console.WriteLine(e.Exception.Message);
            waitHandle.Set();
        };

        WorkflowInstance instance = workflowRuntime.CreateWorkflow(
            typeof(WFSequenceSample.Workflow1));
        instance.Start();

        waitHandle.WaitOne();
    }
}

 ここでの重要な登場人物はSystem.Workflow.Runtime.WorkflowRuntimeクラスです。このクラスはワークフローを実行するためのランタイムで、1つのプロセスに付き1つだけインスタンスを生成し、その上でワークフローを実行します。

 続いてワークフロー終了に関するハンドラ登録を行った後、WorkflowRuntime#createWorkflowメソッドからSystem.Workflow.Runtime.WorkflowInstanceインスタンスを生成しています。引数にWFSequenceSample.Workflow1クラスの型が渡されているので、ここで実行するワークフローを見分けていることが分かります。その後Startメソッドで実行を開始します。

 それぞれの代表的なメンバを記します。

WorkflowRuntimeクラス
メンバ概要
IsStartedプロパティワークフローが実行されているかどうか
AddServiceメソッドSQL Serverへの永続化サービスなど、ワークフロー実行の際に使用するサービスを追加する
CreateWorkflowメソッドワークフローインスタンスを生成する
GetWorkflowメソッド特定のGUIDを持つワークフローインスタンスを取得する
WorkflowInstanceクラス
メンバ概要
InstanceIdプロパティワークフローインスタンスに割り当てられたGUID
Unloadメソッドワークフローインスタンスをメモリから削除し、永続化する
Loadメソッド永続化したワークフローインスタンスを読み込む
Suspendメソッドワークフローインスタンスを一時停止する
Resumeメソッド一時停止したワークフローインスタンスを再開する

 なお、AutoResetEventクラスはSystem.Threading名前空間のクラスで、複数スレッド間での同期を取るために用いられます。ここではワークフロー実行完了を待つために使用しています。

次のページ
まとめ

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Vista時代のプログラミングモデル .NET Framework 3.0入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 土井 毅(ドイ ツヨシ)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1572 2007/09/20 16:09

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング