1

我正在尝试在延迟结束时自动恢复工作流(使用延迟活动)如果您使用 WorkflowServiceHost,则会自动完成,但我使用的是 WorkflowApplication。

互联网上有一些代码可以处理这个问题,这是 我使用 WorkflowApplication 来实现这些目标的示例:

  • 用户创建一个任务,该任务遵循一个工作流
  • 用户使用重新托管的设计器设计自己的工作流程,他的工作流程定义保存在数据库中。
  • 每个工作流定义可以在数据库中保存不同的版本,以允许用户修改其工作流,当对任务执行操作并需要恢复书签时,代码使用正确的版本
  • 可以使用工作流启动任务,因此在任务表中我存储了用于该任务的工作流定义和版本。

我现在遇到的问题是使用延迟活动时使用上面链接的代码,当检测到可运行实例时,我需要创建一个 WorkflowApplication 并使用 LoadRunnableInstance 方法来加载工作流:

if (hasRunnableWorkflows)
{

    Console.WriteLine("Found runnable workflows");
    WorkflowApplication app = new WorkflowApplication(...);
    app.InstanceStore = store;
    app.LoadRunnableInstance();
}

问题是:

  • 要调用 LoadRunnableInstance,我需要创建 WorkflowApplication,因此我需要将根活动提供给 WorkflowApplication CTor
  • 要创建根活动,我需要知道我需要从数据库加载哪个工作流(和版本)
  • 要知道要加载哪个工作流,我需要任务 ID
  • 要知道任务 ID,我需要知道 Workflow ID,它只有在调用 LoadRunnableInstance 后才可用

所以......我需要打破这个循环:)

有人知道在加载工作流之前获得工作流 ID 的方法吗?

4

2 回答 2

0

Microsoft wcf 和 wf 示例中的 ControllingWorkflowApplications 示例显示系统必须维护其工作流 ID 列表才能知道要从实例存储加载哪些工作流。在该示例中,他们还保留了应该能够处理您的版本的工作流 xaml 文件的路径。该示例不是最容易遵循的,但是从 PeristenceIOParticipant 继承的 WorkflowAppication 的扩展已添加到 WorkflowApplication。此类提取并定义将与工作流一起保存的附加数据。出于您的目的,这将是 id。

instance.Extensions.Add(() => new WorkflowDefinitionExtension(originalPath, connectionString)); //继承自PeristenceIOParticipant

于 2012-10-20T14:00:09.140 回答
0

这对我有用。

当工作流运行时触发延迟活动时,将触发事件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"
         },
     }
 };

工作流程应用:

   WorkflowApplication wfApp = new WorkflowApplication(wf);
   wfApp.PersistableIdle = delegate (WorkflowApplicationIdleEventArgs e)
   {
         return PersistableIdleAction.Persist;
   };
   // Start the workflow.
   wfApp.Run();
于 2016-05-22T19:05:45.140 回答