之前已经介绍过工作流的基本概念,提到了工作流有两种基本类型,顺序工作流和状态机工作流。它们的区别主要是前者强调的是顺序过程,后者强调的是状态的改变。
主要区别:
顺序工作流:
顺序工作流的执行过程是一个连续的步骤序列,它在完成一个活动之后会去执行到下一个.比如用顺序工作流模拟将访问记录从网站日志转移到数据库中的操作:第一步,下载日志文件;第二步,将日志批量插入数据库中;第三步,创建新记录的统计结果.尽管顺序工作流也可以使用分支和循环,并且可以接收外部事件,但它的执行过程是可以预料的,并且总是向前执行直到完成为止
状态机工作流:
功能最强大,使用方便
状态机中包含一系列状态(包括初始状态和结束状态)和事件.状态机总是停在一个预设的状态中,直到事件触发之后才会跳转到新的状态上。
具体的区别其实还是需要根据具体的业务进行分析,下面以一个实例来具体说明工作流的流程。机房收费系统我们已经接触过两三遍,在学生上机时,我们需要对余额进行判定,只有符合一定的条件之后才能进行上机,如下图:
实现过程
1、新建程序
建立一个window窗体应用程序
将默认生成的form1窗体删除,重新建立一个窗体,命名为ChargeSystem,然后设计窗体界面,如下:
窗体建立好之后,开始新建工作流,右键——>添加——>新建项,选择workflow中的活动,如下图:
这样我们的程序流程的界面已经建好,我们需要用之前的流程图进行页面设计,建好的活动界面的设计如下:
在此界面中,我们需要声明一些参数与变量,用来传递数据,在页面左下角可以看到“变量”、“参数”、“导入”三个设置选项。定义的变量和参数如下:
此界面中的“judgeOn”类控件是由一个类生成,首先新建代码活动,如下图:
代码如下:
<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Activities;
namespace ChargeSystem
{
public sealed classjudgeOn : CodeActivity
{
// 定义一个字符串类型的活动输入参数和输出参数
publicInArgument<int> Money { get; set; }
publicOutArgument<int> Result { get; set; }
// 如果活动返回值,则从CodeActivity<TResult>
// 派生并从 Execute 方法返回该值。
protected overridevoid Execute(CodeActivityContext context)
{
//获取输入的临时金额
int money =context.GetValue<int>(Money);
//判断金额是否可以上机
if (money > 5){
//金额大于5,可以上机
context.SetValue(Result, 0);
}
else if (money> 3)
{
//金额大于3,提示余额将用完,可以上机
context.SetValue(Result, 1);
}
else {
//金额小于等于3时,提示金额不足,无法上机
context.SetValue(Result, 2);
}
}
}
}
</span>
重新生成解决方案之后,可以在工具栏中看到此控件。
建好之后还需要对控件的一些属性进行设计,“judgeOn”控件的属性设置如下:
“Switch”控件的属性:
窗体中的代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Activities;
namespace ChargeSystem
{
publicpartial class ChargeSystem : Form
{
WorkflowApplication application;
public ChargeSystem()
{
InitializeComponent();
}
private void btnOn_Click(object sender, EventArgs e)
{
//启动工作流
//Activity activity = new Charge();
//WorkflowInvoker.Invoke(activity);
application = new WorkflowApplication(new Charge(), newDictionary<string, object>() { //使用字典传输数据
{"money",int.Parse (txtMoney.Text) }
});
application.Run();
}
}
}
最后记得修改Program类下程序主入口,将之前的Form1,改为现在新建的窗体名称,如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ChargeSystem
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new ChargeSystem());
}
}
}
此时程序已经基本上建立好了,运行前我们需要设置程序的属性,使程序可以在控制台中输出,实现我们的效果,设置如下;
启动程序,效果如下:
小结
这个只是一个简单的工作流demo,通过一个小demo去了解一下工作流的基本概念,然后再去深入的研究,灵活的去掌握工作流的工作方式和过程是目前需要不断努力的方向。