2011年5月16日月曜日

Workflow に引数を設定して実行

以前、デザイナに「引数」タブがなかったので表示するようにしてみた記事を書きましたが、実際にそれを利用する場合は、次のようなロジックになります。なお Workflow では実行時に渡すものも引数と呼び、終了時に受け取るものも引数と呼びます。
1: '入力引数の設定
2: Dim inArgs As New Dictionary(Of String, Object)
3: inArgs.Add([引数名], Value)
4: 
5: Dim wfApps As New WorkflowApplication(wfFile, inArgs)
引数を渡す場合は、このような形で Dictionary を作成し WorkflowApplication や WorkflowInvoker に引き渡します。詳しく調査していないのですが、恐らく WorkflowApplication.HostEnvironment を通しても同様にアクセスできるのではないかな、と思っていますが試していませんw
反対に結果を受け取る場合のロジックは次のようになります。

1: 'WorkflowApplication が実行終了するまで待機状態にする
2: Private syncEvent As New AutoResetEvent(False)
3: 
4: 'WorkflowApplication の Completed イベントをトラップする
5: wfApps.Completed = AddressOf Completed
6: 
7: 'Completed イベント
8: Private Sub Completed(ByVal e As WorkflowApplicationCompletedEventArgs)
9: 
10:     If Not ((e.CompletionState = ActivityInstanceState.Canceled) OrElse
11:             (e.CompletionState = ActivityInstanceState.Faulted)) Then
12:         '正常終了時に結果を取得する
13:         If e.Outputs.ContainsKey([引数名]) Then
14:             wfResult = e.Outputs([引数名]).ToString
15:         End If
16:     End If
17: 
18:     syncEvent.Set()
19: End Sub
WorkflowApplication の場合は非同期で実行されますので上記のように Completed イベントをトラップ、そのイベントにて渡ってくる WorkflowApplicationCompletedEventArgs より結果を取得します。WorkflowInvoker を利用しての実行では、WorkflowInvoker.Invoke メソッドの戻り値として Dictionary が返却されてきますのでそこから取得します。
あとはデザイナ上での引数設定ですが、このような形になります。
Arguments
起動時に受け取る引数の方向を「入力」に、結果として返却する引数の方向を「出力」にするだけです。

0 件のコメント:

コメントを投稿