C# WF4-延迟恢复工作流
我尝试在延迟结束后自动恢复工作流(使用延迟活动) 如果您使用WorkflowServiceHost,这将自动完成,但我使用的是WorkflowApplication 互联网上有一些代码可以处理这个问题,下面是一个 我正在使用WorkflowApplication实现以下目标:C# WF4-延迟恢复工作流,c#,.net,workflow-foundation-4,C#,.net,Workflow Foundation 4,我尝试在延迟结束后自动恢复工作流(使用延迟活动) 如果您使用WorkflowServiceHost,这将自动完成,但我使用的是WorkflowApplication 互联网上有一些代码可以处理这个问题,下面是一个 我正在使用WorkflowApplication实现以下目标: 用户创建一个任务,此任务遵循工作流 用户使用重新注册的设计器设计自己的工作流,其工作流定义保存在数据库中 每个工作流定义可以在数据库中保存不同的版本,以允许用户修改其工作流,并且当对任务执行操作并且需要恢复书签时,代码使
- 用户创建一个任务,此任务遵循工作流
- 用户使用重新注册的设计器设计自己的工作流,其工作流定义保存在数据库中
- 每个工作流定义可以在数据库中保存不同的版本,以允许用户修改其工作流,并且当对任务执行操作并且需要恢复书签时,代码使用正确的版本
- 可以使用工作流启动任务,因此在任务表中,我存储用于此任务的工作流定义和版本
if (hasRunnableWorkflows)
{
Console.WriteLine("Found runnable workflows");
WorkflowApplication app = new WorkflowApplication(...);
app.InstanceStore = store;
app.LoadRunnableInstance();
}
问题是:
- 要调用LoadRunnableInstance,我需要创建WorkflowApplication,因此我需要将根活动赋予WorkflowApplication
- 要创建根活动,我需要知道需要从数据库加载哪个工作流(&V)
- 要知道加载哪个工作流,我需要任务ID
- 要知道任务ID,我需要知道工作流ID,它只有在调用LoadRunnableInstance之后才可用
是否有人知道在加载工作流之前获取工作流ID的方法?来自Microsoft wcf和wf示例的ControllingWorkflowApplications示例显示,系统必须维护其工作流ID列表,才能知道从实例存储加载哪些工作流。在该示例中,它们还保留了工作流xaml文件的路径,该文件应该能够处理您的版本。该示例不是最容易理解的,但WorkflowApplication中添加了从PeristenceIOParticipant继承的WorkflowApp的扩展。此类提取并定义将与工作流一起保存的其他数据。出于您的目的,这将是id Add(()=>newworkflowDefinitionExtension(originalPath,connectionString))//从PeristenceIOParticipant继承而来这对我很有效 当工作流运行时触发延迟活动时,将触发事件PersistableIdle,如果返回PersistableIdleAction.Persist 然后,延迟活动将自动恢复。如果事件处理程序返回PersistableIdleAction.Unload则延迟活动将不会恢复 自动地 这是样品 工作流定义:
Variable<string> name = new Variable<string>
{
Name = "name"
};
wf = new Sequence
{
Variables =
{
name
},
Activities =
{
new WriteLine()
{
Text = "Workflow Triggered"
},
new Delay()
{
Duration = TimeSpan.FromSeconds(10)
},
new WriteLine()
{
Text = "Activity1 Completed"
},
}
};
启动工作流时,需要创建自己的Guid,并将其与工作流Guid一起保存。然后,您可以根据自己的数据启动工作流。请参见,我已经有了工作流id和工作流定义之间的链接。但这里的问题不是启动新的工作流。我需要恢复“a”工作流,但商店没有提供工作流id…但即使您保留了工作流id和xaml的列表,您如何知道LoadRunnableInstance将加载哪个id?“PersistableIdleAction.Persist”阻止卸载工作流,因此它将保留在内存中,并在延迟到期时恢复。这不能用于长时间延迟的情况。
WorkflowApplication wfApp = new WorkflowApplication(wf);
wfApp.PersistableIdle = delegate (WorkflowApplicationIdleEventArgs e)
{
return PersistableIdleAction.Persist;
};
// Start the workflow.
wfApp.Run();