Windows ワークフロー上の StateMachine はスレッド セーフですか?
-
12-09-2019 - |
質問
Windowsワークフローのステートマシンワークフローを使用する予定です。
ステート マシンは 2 つの別個のスレッドからイベントを受信します。もちろん、ステート マシンはその状態を変更し、現在の状態と受信したイベントに基づいてアクションを実行します。
私の質問は、Windows ワークフローのステート マシンはスレッド セーフですか、つまり 2 つのスレッドが同時にアクセスしたときに正しい状態変更が保証されるということです。
解決
ワークフローの実行は、シングルスレッド アパートメントの規則に従います。つまり、ワークフローの 1 つの特定のインスタンスは、ランタイム内で一度に 1 つのスレッドでのみ実行できます。これは仕様によるものです。
ワークフロー ランタイムは内部スケジューリング キューを使用してワークフロー インスタンスの操作を実行するため、同じワークフロー インスタンスで操作を呼び出す 2 つのスレッドは、まずスケジューラー キューにシリアル化され、次にランタイムによってスケジュールされた新しいスレッド (デフォルトのスケジューリング) によって順番に呼び出されます。 )、または各操作の呼び出しコンテキストによって提供されたスレッドによって実行されます (手動スケジューリング)。
永続化サービスを使用する場合、ワークフロー ランタイムはデータベースのバージョンも確実に同期されます。別のプロセス/マシンで実行されている別のワークフロー ランタイムは、別のワークフロー ランタイムによって現在開かれている場合、同じワークフロー インスタンスを永続化からロードできません。
これは、ワークフロー モデル内で実行されるコードのスレッド セーフを気にする必要がなく (プロパティ セッターをロックする必要がないなど)、競合状態を気にする必要がないことを意味します。
他のヒント
(たとえば) 状態アクティビティクラス System.Workflow.Activity 内:
スレッド安全このタイプのパブリックスタティック(視覚的な基本的に共有)メンバーは、スレッドセーフです。インスタンスメンバーは、スレッドセーフであることが保証されていません。
同様の文章が多くの関連する授業で与えられています。私の推測では、あなたが意図している使用法に対してスレッドセーフではないのは「いいえ」です。