ManualWorkflowSchedulerService.RunWorkflow的线程安全性

时间:2008-11-15 22:06:18

标签: workflow-foundation

我很想知道ManualWorkflowSchedulerService.RunWorkflow()的正确用法。当我调用ManualWorkflowSchedulerService.RunWorkflow时,是否需要跨线程同步调用同一个workflowInstanceId?

1 个答案:

答案 0 :(得分:3)

不,我不这么认为。以下是book 'Essential Windows Workflow Foundation'

的相关摘录
  

虽然操作上   可以调用WorkflowInstance   任意线程,WF调度程序   在程序实例中托管的是   由单个线程提供服务。 WF   运行时保证没有其他   线程可以干扰或服务   调度程序循环的调度程序   积极处理工作项目。 要成为   明确,托管应用程序可以   调用WorkflowInstance的方法   并发线程 - 这个   不会影响调度程序   在a上执行活动   专用线程(适用于   执行)。


编辑:为了进一步调查此问题,我创建了一个wf,其ParallelActivity包含两个HandleExternalEvent个活动。每个活动的invoked处理程序只是让其线程休眠3秒钟。在宿主程序中,我创建了两个线程并通过服务触发了两个事件。此外,我将ManualWorkflowSchedulerService子类化,以便跟踪其Schedule方法。结果如下(时间以毫秒为单位):

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. 处理程序的执行是线程安全的,但两个线程都等待两个处理程序完成!
  4. 如果您担心后者,我会建议以下帖子:

    顺便说一下,你能分享一些关于你所面临的情景的信息吗?

相关问题