WorkFlow基础实战

WorkFlow使用笔记----

状态机工作流的使用:

1.首先,项目的目标框架要选择.Net4.5版本,才有状态机工作流。

2.新建“活动”项,先从工具栏拖出一个StateMachine,然后添加其他状态,通过调整状态间的连线,使两状态成为上一状态和下一状态的关系,每种状态都要有一个终态。

下面会有代码介绍如何新建一个工作流。

WorkFlow实例化:

1.定位到 C:\Windows\Microsoft.NET\Framework\v4.0.30319\SQL\en 文件夹,需要用到 SqlWorkflowInstanceStoreSchema.sql 和 SqlWorkflowInstanceStoreLogic.sql 这两个sql文件。

2.打开需要加入工作流持久化的数据库,右击该数据库,选择新建查询,先后执行两个脚本,则看到数据库中多了几张表(如下图)

3.创建一个空闲时自动实例化的工作流

 1             //如果你想要使用工作流进行序列化和持久化。
 2             WorkflowApplication application = new WorkflowApplication(new TestActivity());
 3
 4
 5
 6             SqlWorkflowInstanceStore store = new SqlWorkflowInstanceStore(conStr);
 7             //让当前的我们的applicaton实例跟 数据库关联一块
 8             application.InstanceStore = store;
 9
10             //当工作流空闲的时候立即让我们工作流进行卸载,之前先序列化到 咱们的  数据库里面去。
11
12             application.PersistableIdle = arg => { return PersistableIdleAction.Unload; };
13             //当工作流被卸载时显示卸载信息
14             application.Unloaded += a => { Console.WriteLine("工作流停下来了"); };
15             application.Run();//启动一个新的线程帮助我们执行工作流。

简单的工作流实例化例子以及书签(暂停工作流)的编写和使用:

1.新建一个winform项目,更改项目输出类型为“控制台”。

2.新建“代码活动”项,修改新建项的代码如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Activities;
 6
 7 namespace TestWF
 8 {
 9     //书签有4步
10     //1.改基类:CodeActivity改为NativeActivity
11     //2.重写属性CanInduceIdle,改为return true;
12     //3.修改Execute方法的传入参数类型CodeActivityContext改为NativeActivityContext
13     //4.利用context.CreateBookmark(text,new BookmarkCallback(MyCallBack));创建书签
14     public sealed class BookMarkActivity : NativeActivity
15     {
16         // 定义一个字符串类型的活动输入参数
17         public InArgument<string> Text { get; set; }
18
19         protected override bool CanInduceIdle
20         {
21             get
22             {
23                 return true;
24             }
25         }
26
27
28         // 如果活动返回值,则从 CodeActivity<TResult>
29         // 派生并从 Execute 方法返回该值。
30         protected override void Execute(NativeActivityContext context)
31         {
32             // 获取 Text 输入参数的运行时值
33             //string text = context.GetValue(this.Text);
34
35             context.CreateBookmark("TestWF",MyCallBack);
36         }
37
38         private void MyCallBack(NativeActivityContext context, Bookmark bookmark, object value)
39         {
40             //可以在书签中操作书签的返回值
41         }
42     }
43 }

3.新建“活动”项,拖出工作流如下图所示:

在审查金额状态中,添加如下项(如果工具栏中不存在BookMark项,请重新生成解决方案试试):

4.在项目中添加app.config配置文件,添加连接字符串的appSetting项:

1 <?xml version="1.0" encoding="utf-8" ?>
2 <configuration>
3     <startup>
4         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
5     </startup>
6   <appSettings>
7     <add key="conStr" value="Data Source=./;Initial Catalog=MyOA;Integrated Security=true; "/>
8   </appSettings>
9 </configuration>

5.Form1窗口的设计:

6.在Form1.cs中添加代码:

 1 using System;
 2 using System.Activities;
 3 using System.Activities.DurableInstancing;
 4 using System.Collections.Generic;
 5 using System.ComponentModel;
 6 using System.Configuration;
 7 using System.Data;
 8 using System.Drawing;
 9 using System.Linq;
10 using System.Text;
11 using System.Threading.Tasks;
12 using System.Windows.Forms;
13
14 namespace TestWF
15 {
16
17     public partial class Form1 : Form
18     {
19         public Form1()
20         {
21             InitializeComponent();
22             textBox1.Text = Clipboard.GetText();
23         }
24
25         public static string conStr = ConfigurationManager.AppSettings["conStr"];
26         private void button3_Click(object sender, EventArgs e)
27         {
28             #region 开启工作流代码
29             //如果你想要使用工作流进行序列化和持久化。
30             WorkflowApplication application = new WorkflowApplication(new TestActivity());
31
32
33
34             SqlWorkflowInstanceStore store = new SqlWorkflowInstanceStore(conStr);
35             //让当前的我们的applicaton实例跟 数据库关联一块
36             application.InstanceStore = store;
37
38             //当工作流空闲的时候立即让我们工作流进行卸载,之前先序列化到 咱们的  数据库里面去。
39
40             application.PersistableIdle = arg => { return PersistableIdleAction.Unload; };
41             //当工作流被卸载时显示卸载信息
42             application.Unloaded += a => { Console.WriteLine("工作流停下来了"); };
43             application.Run();//启动一个新的线程帮助我们执行工作流。
44             #endregion
45             textBox1.Text = application.Id.ToString();
46             //将工作流的guid粘贴到剪贴板中,以便下一次程序启动时能取到
47             Clipboard.SetText(textBox1.Text);
48
49         }
50
51         private void button2_Click(object sender, EventArgs e)
52         {
53             #region 恢复工作流代码
54             WorkflowApplication application = new WorkflowApplication(new TestActivity());
55
56             SqlWorkflowInstanceStore store = new SqlWorkflowInstanceStore(conStr);
57             //让当前的我们的applicaton实例跟 数据库关联一块
58             application.InstanceStore = store;
59
60             //当工作流空闲的时候立即让我们工作流进行卸载,之前先序列化到 咱们的  数据库里面去。
61             application.PersistableIdle = arg => { return PersistableIdleAction.Unload; };
62
63             application.Load(Guid.Parse(textBox1.Text));
64             application.ResumeBookmark("TestWF","");
65             #endregion
66         }
67
68
69     }
70 }

7.运行结果如下图:

当点击“开启工作流”时,提示“请输入金额”,当输入金额回车后由于有书签,工作流停下来被实例化到数据库中程序打印出“工作流停下来了”,再点击“重新开启工作流”,工作流继续运行到其他FinalState状态。

时间: 2024-10-17 10:37:07

WorkFlow基础实战的相关文章

《nodejs+gulp+webpack基础实战篇》课程笔记(四)-- 实战演练

一.用gulp 构建前端页面(1)---静态构建 npm install gulp-template --save-dev 通过这个插件,我们可以像写后台模板(譬如PHP)一样写前端页面.我们首先学习一下写法. 现在我们创建一个新任务:创建一个裸的index.html文件,然后在body里面写上 ,我的年龄是:<%= age %> 下载好gulp-template,我们引用并配置 var gulp_tpl = require("gulp-template"); gp.tas

CSDN学霸课表——从应用解析到基础实战,大数据入门、晋级课程推荐

[大数据]Splunk企业级运维智能&大数据分析平台新手入门视频课程 讲师:张文星 本课程系Splunk入门系列课程,实战为主,实战中穿插相关概念和理论.课程包括Splunk基础知识.安装部署.数据采集和存储.数据可视化.创建Splunk应用等.数据分析和可视化部分基于两个案例,边动手边讲解. [Hadoop]Hadoop2.X 应用解析 讲师:李锋 通过学习Hadoop2.X的教程,使学员能够掌握Hadoop2的应用原理,对Hadoop2的体系结构有清晰的认识,并能够熟练部署Hadoop2的高

MySQL的初次见面礼基础实战篇

[版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/61614366 出自[zejian的博客] 本篇将以最简单的方式呈现并演绎mysql数据库的必知必会的知识点,通过本篇博文您将会对mysql从起点到终点的较为全面的认识,关于mysql的知识,将分两篇来记录,即MySQL的基础实战篇和MySQL的进阶实战篇,以下是本篇的主要知识点. 基础实战篇 环境准备 数据库与表的创建以及SQL增

《nodejs+gulp+webpack基础实战篇》课程笔记(七)--利用gulp自动完成配置&quot;吐&quot;给webpack执行

首先,我们利用gulp将入口文件自动化.我们参考该课程的规则,对文件需要成为入口的文件进行一个归类和整理. 首先,我们已经建立了SRC文件夹.在SRC文件下,创建一个主文件夹叫modules.同事创建几个子文件夹,创建的基本规则是:文件夹名就代表了我们的入口节点名. (此图仅供参考,文件夹名与文件名可自定义) 然后我们来到gulpfile.js,写入一个任务,在gulpfile中遍历modules文件夹里的文件夹和子文件(为了演示方便,我们默认遍历2级.第一级必须是文件夹名.第二级必须是js文件

《nodejs+gulp+webpack基础实战篇》课程笔记(八)--模板化开发演练:分离公共头文件

还是先来安装本课需要的插件: npm install raw-loader --save-dev //示例:var header = require("xxx.html");就会把html的内容读取出来 这是一个webpack加载器,可以把文件原样返回为字符串. 这里补充下使用加载器的两种方法: 1.在我们的webpack配置文件中写上 {test:/\.html$/,loader:"加载器名称"} //这代表所有html后缀均会使用这个加载器来处理 2.在requ

《nodejs+gulp+webpack基础实战篇》课程笔记(三)--webpack篇

webpack引入 前面我们简单学习了gulp,这时一个前端构建框架---webpack产生了(模块打包) 它能帮我们把本来需要在服务端运行的JS代码,通过模块的引用和依赖打包成前端可用的静态文件.(这里有需要了解一下CommonJS规范,具体请自行查看http://commonjs.org). 安装webpack: npm install -g wabpack //这里我们采用全局安装,保证每个项目中都能使用到 设置配置文件:  在项目目录下,新建一个webpack.config.js文件 m

《nodejs+gulp+webpack基础实战篇》课程笔记(六)--附加课

一.多页面分离资源引用,按需引用JS和css 我们前面实现了以下功能:1.新建了一个login模版(用到htmlWebpackPlugin).2.分别把main.js和login.js.reg.js分开写.3.学习了css加载器.我们通过webpack可以打包js文件.自动注入js和CSS引用. 那么我们要加载多页面如何操作呢?现在我们就在/src/tpl 文件夹下新件一个index.html文件,在CSS加入index.css,随便写两个样式,然后在/src/下新建一个index.js,随便写

Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵基础实战

Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵基础实战 Springboot: 2.1.8.RELEASE SpringCloud: Greenwich.SR2 1. Sentinel控制台概述 在介绍入门实战之前,先来介绍一下Sentinel.Sentinel控制台提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理.监控(单机和集群),规则管理和推送的功能. Sentinel控制台主要功能: 查看机器列表以及健康情况:收集 Sentinel 客户

Nodejs入门级基础+实战

这篇随笔将会按序记录如下内容: NodeJs 简介 安装  NodeJs HTTP 模块.URL 模块 CommonJs 和 Nodejs 中自定义模块 NodeJs FS 模块 利用 HTTP 模块 URl 模块 PATH 模块 FS模块创建一个 WEB 服务器(基础实战) 关于Node.js的非阻塞IO,异步,事件驱动基础 cnpm淘宝镜像:npm install -g cnpm --registry=https://registry.npm.taobao.org 1.NodeJs简介 安装