0

我打算使用 Windows 工作流的状态机工作流。

状态机将从两个单独的线程接收事件,当然状态机将根据其当前状态和传入的事件更改其状态并执行操作。

我的问题是,windows工作流线程的状态机是否安全,这意味着当两个线程同时访问它时,它会保证正确的状态变化?

4

2 回答 2

4

工作流执行遵循单线程单元约定——也就是说,工作流的一个特定实例在任何运行时内一次只能由一个线程执行。这是设计使然。

工作流运行时使用内部调度队列来执行工作流实例的操作,因此对同一工作流实例调用操作的两个线程将首先序列化到调度程序队列,然后由运行时调度的新线程依次调用(默认调度) 或由每个操作的调用上下文捐赠的线程(手动调度)。

使用持久性服务时,工作流运行时还确保数据库版本也同步 - 如果另一个工作流运行时当前打开同一工作流实例,则在另一个进程/机器上运行的另一个工作流运行时无法从持久性中加载相同的工作流实例。

这意味着您不必关心在工作流模型中执行的代码的线程安全(例如,您不必锁定属性设置器),并且您不必关心竞争条件。

于 2009-08-25T06:00:28.927 回答
1

您对(例如)System.Workflow.Activiti 中的State Activity CLass的 Microsoft 文档中的此类事情有何解释:

线程安全 此类型的任何公共静态(在 Visual Basic 中为 Shared)成员都是线程安全的。不保证任何实例成员都是线程安全的。

类似的段落在许多相关课程中都有给出。我的推断是“不”,对于您打算使用的线程来说不是线程安全的。

于 2009-08-06T21:46:25.220 回答