ManualWorkflowSchedulerService.RunWorkflow() の適切な使用法について疑問に思いました。ManualWorkflowSchedulerService.RunWorkflow を呼び出すとき、スレッド間で同じ workflowInstanceId への呼び出しを同期する必要がありますか?
1 に答える
いいえ、そうは思いません。以下は、本「Essential Windows Workflow Foundation」からの関連する抜粋です。
WorkflowInstance の操作は任意のスレッドで呼び出すことができますが、プログラム インスタンス内でホストされる WF スケジューラは単一のスレッドによって処理されます。WF ランタイムは、ディスパッチャ ループが作業項目をアクティブに処理している間、他のスレッドがスケジューラに干渉したり、スケジューラにサービスを提供したりできないことを保証します。明確にするために、ホスティング アプリケーションは別のスレッドで WorkflowInstance のメソッドを同時に呼び出すことができます。これは、専用スレッドでアクティビティを実行するスケジューラには影響しません(実行のエピソード)。
編集:問題をさらに調査するために、 2 つのアクティビティParallelActivity
を含むwf を作成しました。HandleExternalEvent
各アクティビティのinvoked
ハンドラーは、そのスレッドを 3 秒間スリープ状態にします。ホスト プログラムでは、2 つのスレッドを作成し、サービスを介して 2 つのイベントをトリガーしました。ManualWorkflowSchedulerService
さらに、メソッドを追跡するためにをサブクラス化しSchedule
ます。結果は次のとおりです (時間はミリ秒の 10 分の 1 です)。
Src Time Thread
HOST 7616 1 CreateWorkflow
MWSS 7642 1 Schedule workflow
HOST 8297 12 Trigger event 1 and wait for RunWorkflow
MWSS 8316 12 Schedule workflow
WF 8327 12 Handler 1 Invoked...wait 3 sec
HOST 8327 1 Press any key to exit...
HOST 8767 13 Trigger event 2 and wait for RunWorkflow
MWSS 8784 13 Schedule workflow
WF 38319 12 Handler 1 Completed
WF 38406 12 Handler 2 Invoked...wait 3 sec
WF 68396 12 Handler 2 Completed
HOST 68573 13 RunWorkflow for event 2 completed in 5,98 sec
HOST 68794 12 WorkflowCompleted
HOST 68795 12 RunWorkflow for event 1 completed in 6,05 sec
いくつかのコメント:
- スケジューラは、常にホストのスレッドを使用してワークアイテムをスケジュールします。
- ワークフロー インスタンスは、常にホストのスレッドを使用してアクティビティを実行するとは限りません。別のアクティビティがスレッドですでに実行されている場合、このスレッドはスケジュールされたすべてのアクティビティの実行に使用されます。
- ハンドラーの実行はスレッドセーフですが、両方のスレッドが両方のハンドラーの終了を待ちます!
後者が懸念される場合は、次の投稿をお勧めします。
ところで、あなたが直面しているシナリオについての情報を共有できますか?