SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

Workflow Foundation 4が導く新しい開発スタイル

「Workflow Foundation 4」の中心~アクティビティの作成

Workflow Foundation 4が導く新しい開発スタイル(2)

 アクティビティが実装できたら、次にMainメソッドにて作成したアクティビティを実行する処理を記述します。ここでは以下のような記述を行います。

サンプルコード(Visual Basic)
Imports System.Activities
Sub Main()
    'アクティビティの作成
    Dim act = New SampleActivity With {
        .OutputStrings = “Workflow Foundation 4!”}
    'ワークフローの実行
    Dim wfInv As New WorkflowInvoker(act)
    wfInv.Invoke()
    Console.ReadLine()
End Sub
サンプルコード(C#)
using System; 
using System.Activities; 
void Main()
{
    //アクティビティの作成
    var act = New SampleActivity()
    {
        OutputStrings = “Workflow Foundation 4!”;
    }
    //ワークフローの実行
    var wfInv = new WorkflowInvoker(act); 
    wfInv.Invoke(); 
    Console.ReadLine(); 
}

 このようにMainメソッドを実装したらビルドし実行します。標準出力に「Workflow Foundation 4!」と出力されるのが確認できます。

サンプルの実行結果
サンプルの実行結果
使い回されるアクティビティ

 前述のとおり、アクティビティは複製され利用される挙動となります。それを検証するのが次のような処理になります。

サンプルコード(Visual Basic)
'ワークフローへ変数の追加
Dim wfVar As New Variable(Of Integer) With {
    .Name = "wfValue"}
Dim seq As New Sequence
seq.Variables.Add(wfVar)
 
Dim ass As New Assign(Of Integer) With {
    .To = wfVar, .Value = (New Random).Next(1, 100)}
seq.Activities.Add(ass)

Dim wrt As New WriteLine With {
    .Text = New InArgument(Of String)(Function(env) "生成された値は " + wfVar.Get(env).ToString)}
seq.Activities.Add(wrt)
 
Dim wfApp As New WorkflowInvoker(seq)
wfApp.Invoke()
 
Console.WriteLine("2回目の実行")
wfApp.Invoke()
 
Console.WriteLine("3回目の実行")
wfApp.Invoke()

 これはAssignアクティビティにて生成した乱数を設定、その結果をWriteLineアクティビティで出力するワークフローです。見た感じでは毎回ランダムな値が出力されると思われますが、実際に実行すると1~3度目全てにおいて同一の値が出力されます。

同一の値が出力される
同一の値が出力される

 これは1度目のAssignアクティビティ生成時に発生した乱数を保持した状態で、アクティビティが複製され利用されていることを表します。これを回避するためにはAssignアクティビティに設定する部分を次のように記述します。

サンプルコード(Visual Basic)
Dim ass As New Assign(Of Integer) With {
         .To = wfVar,
         .Value = New VisualBasicValue(Of Integer)("New Random().Next(1, 100)") }

 このようにVisualBasicValueクラスを利用すると実行時に処理を再評価します。WFではこのような形で明示的に「式」や「値」を実装する必要があります。デザイナー上で作成した場合も、このような実装を行っているため、XAMLファイルに保存されている内容を確認してみてください。

次のページ
非同期処理を行うAsyncCodeActivity

修正履歴

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

Workflow Foundation 4が導く新しい開発スタイル連載記事一覧

もっと読む

この記事の著者

小尾 智之(オビ トモユキ)

地方企業に勤めるインディープロレス好きなエンジニア。VB + SQL Server のシステム構築を主な業務としていましたが、元々の性格もあり色々な物に目移り中。Ahf というハンドルネームで所属する北海道の技術コミュニティ CLR/H(http://clr-h.jp) での活動など行っていましたが、最近か...

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/6652 2012/07/13 14:00

イベント

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

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

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

メールバックナンバー