1

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

4

1 回答 1

3

不,我不这么认为。以下是“Essential Windows Workflow Foundation”一书的相关摘录

尽管可以在任意线程上调用 WorkflowInstance 上的操作,但托管在程序实例中的 WF 调度程序由单个线程提供服务。WF 运行时保证在调度程序循环正在积极处理工作项时,没有其他线程可以干扰或服务调度程序。需要明确的是,托管应用程序可以同时在单独的线程上调用 WorkflowInstance 的方法——这不会影响调度程序在专用线程上执行活动(对于一个执行片段)。


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

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. 处理程序的执行是线程安全的,但是两个线程都等待两个处理程序完成!

如果您担心后者,我建议您发布以下帖子:

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

于 2008-11-15T23:18:00.390 回答