这似乎是一个基本问题,但我无法在任何地方找到答案:
我有几种不同类型的长时间运行的状态机工作流,我正在使用中央数据库在多个主机应用程序中工作。我正在使用SqlWorkflowPersistenceService来持久化它们。所以说我有三种工作流类型WorkflowOne,WorkflowTwo和WorkflowThree。其中每个实例都由一个用户启动并持久保存到数据库中。另一位用户出现并希望进行各种更改,因此他们启动了应用程序。现在,我可以使用持久性服务为我提供所有持久化实例的列表,但我如何知道哪个是WorkflowOne类型,哪个是WorkflowTwo或WorkflowThree?
答案 0 :(得分:4)
有几种方法可以做到这一点。
第一个选项是使用WorkflowPersistenceService本身并执行以下操作:
var persistenceService = new SqlWorkflowPersistenceService("<<connection string>>");
var persistedWorkflows = persistenceService.GetAllWorkflows();
foreach (var persistedWorkflow in persistedWorkflows)
{
var workflowInstance = workflowRuntime.GetWorkflow(persistedWorkflow.WorkflowInstanceId);
var workflowDefinition = workflowInstance.GetWorkflowDefinition();
Console.WriteLine(workflowDefinition.GetType().FullName);
}
您可以轻松使用SqlWorkflowPersistenceService,但它的缺点是必须将所有工作流实例加载到内存中,并且您有责任将其从内存中删除。
第二个选项是使用工作流跟踪:
var trackingQuery = new SqlTrackingQuery("<<connection string>>");
var queryOptions = new SqlTrackingQueryOptions()
{
WorkflowStatus = WorkflowStatus.Running
};
var runningWorkflows = trackingQuery.GetWorkflows(queryOptions);
foreach (var runningWorkflow in runningWorkflows)
{
Console.WriteLine(runningWorkflow.WorkflowType);
}
优点是您不需要将实际工作流程定义加载到内存中以检查其类型。缺点是你必须添加SqlTrackingService以及它自己的数据库,增加了复杂性和开销。
答案 1 :(得分:0)
不确定这是否是最好的方法,但我只是保护每个WF实例,然后比较它的Name属性,看看是否是我正在寻找的实例。