Workflow中的四大已注册核心服务
核心运行时服务 | |||
名称 | 描述 | 可选 | 默认实现 |
计划服务 | 创建并管理线程,供运行时引擎执行工作流实例时使用 | 否 | DefaultWorkflowSchedulerService ManualWorkflowSchedulerService |
Commit Work Batch | 管理事务 | 否 | DefaultWorkflowCommitWorkBatchService SharedConnectionWorkflowCommitWorkBatchService |
持久性服务 | 处理由运行时引擎操控的工作流实例的持久性 | 是 | 无 |
跟踪服务 | 通过记录跟踪事件提供实现工作流实例的能力 | 是 | 无 |
注:如果同时使用了SqlTrackingService(跟踪服务)和 SqlWorkflowPersistenService(持久化服务),那么为了体验最好的性能,应该为这两个服务使用同一个数据库和服务器。如果这两个服务使用了不同的数据库或数据库服务器,那么就必须从分布式事务处理协调器(DTC)中获取分布式事务。分布式事务会带来十分昂贵的性能消耗,应当避免这种做法。
如果为两个服务使用了同一个数据库,就可以加载SharedConnectionWorkflowCommitWorkBatchService来代替默认的提交批次服务,该服务为跟踪和持久性数据库使用了一个共享连接,以此来避免使用分布式事务。
使用四大服务
通过在配置文件中添加服务
<configuration>
<configSections>
<section name="WorkflowRuntime" type="System.Workflow.Runtime.Configuration.WorkflowRuntimeSection, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</configSections>
<WorkflowRuntime Name="WorkflowServiceContainer">
<CommonParameters>
<add name="ConnectionString" value="Data Source=.;Initial Catalog=WorkflowTracking;Integrated Security=True" />
</CommonParameters>
<Services>
<add type="System.Workflow.Runtime.Hosting.ManualWorkflowSchedulerService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add type="System.Workflow.Runtime.Hosting.SharedConnectionWorkflowCommitWorkBatchService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add type="System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
UnloadOnIdle="true"/>
<add type="System.Workflow.Runtime.Tracking.SqlTrackingService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
IsTransactional="true" UseDefaultProfile="true" />
</Services>
</WorkflowRuntime>
</configuration>
ManualWorkflowSchedulerService 计划服务,在宿主程序线程上同步执行工作流
使用方法:
using (WorkflowRuntime workflowRuntime = new WorkflowRuntime("WorkflowRuntime"))
{
ManualWorkflowSchedulerService manualScheduler =
workflowRuntime.GetService(typeof(ManualWorkflowSchedulerService))
as ManualWorkflowSchedulerService; //在宿主线程上执行工作流
//AutoResetEvent waitHandle = new AutoResetEvent(false); 当工作流中有delay活动时,必须添加
定义事件(省略)
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WorkflowProject1.Workflow1), arguments);
instance.Start();
manualScheduler.RunWorkflow(instance.InstanceId); //在宿主线程上执行工作流
//waitHandle.WaitOne(); 当工作流中有delay活动时,必须添加
Console.WriteLine("ok");
Console.Read();
}
上述实例添加了4个核心服务,添加第三个服务是因为sql server持久性服务和跟踪服务共享一个连接(同一个数据库),可以根据需求来修改配置文件 添加相应的服务。