Windows ワークフローのステート マシン ワークフローを使用する予定です。
ステート マシンは 2 つの別々のスレッドからイベントを受け取ります。ステート マシンはもちろん、現在の状態と入ってきたイベントに基づいて状態を変更し、アクションを実行します。
私の質問は、Windows ワークフロー スレッド セーフのステート マシンですか。つまり、2 つのスレッドが同時にアクセスしたときに正しい状態変更が保証されるということですか?
Windows ワークフローのステート マシン ワークフローを使用する予定です。
ステート マシンは 2 つの別々のスレッドからイベントを受け取ります。ステート マシンはもちろん、現在の状態と入ってきたイベントに基づいて状態を変更し、アクションを実行します。
私の質問は、Windows ワークフロー スレッド セーフのステート マシンですか。つまり、2 つのスレッドが同時にアクセスしたときに正しい状態変更が保証されるということですか?
ワークフローの実行は、シングル スレッド アパートメントの規則に従います。つまり、ワークフローの特定の 1 つのインスタンスは、任意のランタイム内で一度に 1 つのスレッドによってのみ実行できます。これは仕様によるものです。
ワークフロー ランタイムは内部スケジューリング キューを使用してワークフロー インスタンスの操作を実行するため、同じワークフロー インスタンスで操作を呼び出す 2 つのスレッドは、最初にスケジューラ キューにシリアル化され、次にランタイムによってスケジュールされた新しいスレッド (デフォルトのスケジューリング) によって順番に呼び出されます。 ) または各操作の呼び出しコンテキストによって提供されたスレッド (手動スケジューリング)。
永続化サービスを使用する場合、ワークフロー ランタイムはデータベースのバージョンも同期されるようにします。別のプロセス/マシンで実行されている別のワークフロー ランタイムは、別のワークフロー ランタイムによって現在開かれている場合、同じワークフロー インスタンスを永続化からロードできません。
つまり、ワークフロー モデル内で実行するコードのスレッド セーフを気にする必要はなく (たとえば、プロパティ セッターをロックする必要はありません)、競合状態を気にする必要もありません。
(たとえば) System.Workflow.ActivitieのState Activity CLassに関する Microsoft ドキュメントで、この種のことをどのように解釈していますか。
スレッド セーフ この型の public static (Visual Basic では共有) メンバーはすべて、スレッド セーフです。インスタンス メンバーは、スレッド セーフであるとは限りません。
同様の文章が多くの関連するクラスで与えられています。私の推論は、意図した使用法に対してスレッドセーフではない「いいえ」です。