1

ManualWorkflowSchedulerService.RunWorkflow() の適切な使用法について疑問に思いました。ManualWorkflowSchedulerService.RunWorkflow を呼び出すとき、スレッド間で同じ workflowInstanceId への呼び出しを同期する必要がありますか?

4

1 に答える 1

3

いいえ、そうは思いません。以下は、本「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

いくつかのコメント:

  1. スケジューラは、常にホストのスレッドを使用してワークアイテムをスケジュールします。
  2. ワークフロー インスタンスは、常にホストのスレッドを使用してアクティビティを実行するとは限りません。別のアクティビティがスレッドですでに実行されている場合、このスレッドはスケジュールされたすべてのアクティビティの実行に使用されます。
  3. ハンドラーの実行はスレッドセーフですが、両方のスレッドが両方のハンドラーの終了を待ちます!

後者が懸念される場合は、次の投稿をお勧めします。

ところで、あなたが直面しているシナリオについての情報を共有できますか?

于 2008-11-15T23:18:00.390 に答える