我想知道 ManualWorkflowSchedulerService.RunWorkflow() 的正确用法。当我调用 ManualWorkflowSchedulerService.RunWorkflow 时,是否需要跨线程同步对同一个 workflowInstanceId 的调用?
Frank Schwieterman
问问题
946 次
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
一些备注:
- 调度程序总是使用主机的线程来调度工作项。
- 工作流实例并不总是使用宿主的线程来执行活动。如果另一个活动已经在线程中执行,则该线程用于执行所有计划的活动。
- 处理程序的执行是线程安全的,但是两个线程都等待两个处理程序完成!
如果您担心后者,我建议您发布以下帖子:
顺便说一句,你能分享一些关于你所面临的场景的信息吗?
于 2008-11-15T23:18:00.390 回答