前面介绍的Schedule可以启动一个后台的定时任务,这个任务只执行一次。如果需要执行多次固定间隔的任务,可以使用Recur,当条件满足时任务不再执行。Recur的定义与Schedule类似,只是多了条件判断输入,流程定义的代码如下:
using System;
using System.Collections.Generic;
using System.Text;
using WorkflowCore.Interface;
using ZL.WorflowCoreDemo.InputDataToStep;
using ZL.WorflowCoreDemo.InputDataToStep.Steps;
namespace ZL.WorflowCoreDemo.ControlStructures
{
public class RecurWorkflow : IWorkflow<MyNameClass>
{
public string Id => "RecurWorkflow";
public int Version => 1;
public void Build(IWorkflowBuilder<MyNameClass> builder)
{
builder
.StartWith(context => Console.WriteLine("开始"))
.Recur(data => TimeSpan.FromSeconds(5),data=>data.MyName.Length>5).Do(recur => recur
.StartWith<HelloWithName>()
.Input(step => step.Name, data => data.MyName))
.Then(context => Console.WriteLine("前台工作"))
.Activity("activity-1", (data) => data.MyName)
.Output(data => data.MyName, step => step.Result);
}
}
}
这流程稍微复杂一点,我们增加了使用Activity的输入,目的是看一下前台的输入等待是否会影响后台的进程运行,还有就是前台输入的数据,能否正确传递到后台,流程的运行代码如下:
IServiceProvider serviceProvider = ConfigureServices();
var host = serviceProvider.GetService<IWorkflowHost>();
host.RegisterWorkflow<RecurWorkflow,MyNameClass>();
host.Start();
var myClass = new MyNameClass { MyName = "张三" };
var workflowId = host.StartWorkflow("RecurWorkflow", 1, myClass).Result;
var activity = host.GetPendingActivity("activity-1", "worker1", TimeSpan.FromMinutes(1)).Result;
if (activity != null)
{
Console.WriteLine("输入名字");
string value = Console.ReadLine();
host.SubmitActivitySuccess(activity.Token, value);
}
Console.ReadLine();
host.Stop();
运行效果如下:
可以看出,前台需要的输入等待并没有影响后台的执行,我们输入一个新名字后:
数据正确传递到后台,只是由于我们输入的数据没有满足退出条件,任务会继续执行,直到执行流程结束命令。