アクティビティが実装できたら、次にMainメソッドにて作成したアクティビティを実行する処理を記述します。ここでは以下のような記述を行います。
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
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!」と出力されるのが確認できます。
前述のとおり、アクティビティは複製され利用される挙動となります。それを検証するのが次のような処理になります。
'ワークフローへ変数の追加
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アクティビティに設定する部分を次のように記述します。
Dim ass As New Assign(Of Integer) With {
.To = wfVar,
.Value = New VisualBasicValue(Of Integer)("New Random().Next(1, 100)") }
このようにVisualBasicValueクラスを利用すると実行時に処理を再評価します。WFではこのような形で明示的に「式」や「値」を実装する必要があります。デザイナー上で作成した場合も、このような実装を行っているため、XAMLファイルに保存されている内容を確認してみてください。
