0

私はWindowsワークフローのステートマシンワークフローを使用する予定です。WindowsワークフローでStateMachineはスレッドセーフですか?

ステートマシン、2つの別々のスレッドからイベントを受信します

、当然のステートマシンは、その状態を変更し、その現在の状態に基づいて行動し、入って来たイベントを実行します両方。

私の質問があり、さWindowsワークフロースレッドの状態マシンは安全です。つまり、2つのスレッドが同時にそのスレッドにアクセスするときに、正しい状態変更が保証されますか? Microsoftのドキュメントでこの種のもののあなたの解釈は、(例えば)のために何

答えて

4

ワークフローの実行は、シングルスレッドアパートメントの規約に従います。つまり、ワークフローの特定のインスタンスは、実行時に1度に1つのスレッドによってのみ実行できます。これは設計によるものです。

ワークフローランタイムは、内部スケジューリングキューを使用してワークフローインスタンスの操作を実行するため、同じワークフローインスタンスで操作を呼び出す2つのスレッドは、最初にスケジューラキューにシリアル化され、実行時(デフォルトのスケジューリング)、または各操作の呼び出しコンテキストによって寄贈されたスレッド(手動スケジューリング)によって実行されます。

ワークフローランタイムは、データベースバージョンの同期も保証します。別のワークフローランタイムが別のワークフローランタイムによって現在開いている場合、同じワークフローインスタンスを永続性からロードすることはできません。

これは、ワークフローモデル内で実行されるコードのスレッドセーフティに関心を持つ必要がないことを意味します(たとえば、プロパティセッターをロックする必要はありません)。また、レースに関心を持つ必要はありません条件。

1

System.Workflow.ActivitieでState Activity CLass

スレッドセーフ メンバー(ビジュアル BasicではShared)すべてのパブリックstaticこのタイプのスレッドは、スレッド です。すべてのインスタンスメンバは、スレッドセーフであることが保証されている ではありません。

多くの関連クラスでは、同様の節が与えられています。私の推論はあなたが意図している用法に対してスレッドセーフではない "いいえ"です。

+0

Windows WorkFlowに当てはまるかどうか不安です。 Windows WorkFlowの操作の多くはあなたのために行われるため、操作するクラスだけでなく、フレームワークのように機能します。 – aattia

+0

これらは明示的にWindows Workflowのクラスのドキュメントに記載されています。 APIを呼び出す場合は、スレッドの安全性を気にする必要があります。私は、Windows Workflowのフレームワークの側面がそれを正しいものにし、必要な場所で同期すると仮定することは合理的だと思います。あなたがdeisgnがこのことを気にしている場所のスケッチを見せてくれれば助けになるかもしれません。 – djna

関連する問題