Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WF4-延迟恢复工作流_C#_.net_Workflow Foundation 4 - Fatal编程技术网

C# WF4-延迟恢复工作流

C# WF4-延迟恢复工作流,c#,.net,workflow-foundation-4,C#,.net,Workflow Foundation 4,我尝试在延迟结束后自动恢复工作流(使用延迟活动) 如果您使用WorkflowServiceHost,这将自动完成,但我使用的是WorkflowApplication 互联网上有一些代码可以处理这个问题,下面是一个 我正在使用WorkflowApplication实现以下目标: 用户创建一个任务,此任务遵循工作流 用户使用重新注册的设计器设计自己的工作流,其工作流定义保存在数据库中 每个工作流定义可以在数据库中保存不同的版本,以允许用户修改其工作流,并且当对任务执行操作并且需要恢复书签时,代码使

我尝试在延迟结束后自动恢复工作流(使用延迟活动) 如果您使用WorkflowServiceHost,这将自动完成,但我使用的是WorkflowApplication

互联网上有一些代码可以处理这个问题,下面是一个 我正在使用WorkflowApplication实现以下目标:

  • 用户创建一个任务,此任务遵循工作流
  • 用户使用重新注册的设计器设计自己的工作流,其工作流定义保存在数据库中
  • 每个工作流定义可以在数据库中保存不同的版本,以允许用户修改其工作流,并且当对任务执行操作并且需要恢复书签时,代码使用正确的版本
  • 可以使用工作流启动任务,因此在任务表中,我存储用于此任务的工作流定义和版本
我现在遇到的问题是何时使用延迟活动 使用上面链接的代码,当检测到可运行实例时,我需要创建WorkflowApplication并使用LoadRunnableInstance方法加载工作流:

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();