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.创建一个空闲时自动实例化的工作流
//如果你想要使用工作流进行序列化和持久化。
WorkflowApplication application = new WorkflowApplication(new TestActivity()); SqlWorkflowInstanceStore store = new SqlWorkflowInstanceStore(conStr);
//让当前的我们的applicaton实例跟 数据库关联一块
application.InstanceStore = store; //当工作流空闲的时候立即让我们工作流进行卸载,之前先序列化到 咱们的 数据库里面去。 application.PersistableIdle = arg => { return PersistableIdleAction.Unload; };
//当工作流被卸载时显示卸载信息
application.Unloaded += a => { Console.WriteLine("工作流停下来了"); };
application.Run();//启动一个新的线程帮助我们执行工作流。
简单的工作流实例化例子以及书签(暂停工作流)的编写和使用:
1.新建一个winform项目,更改项目输出类型为“控制台”。
2.新建“代码活动”项,修改新建项的代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Activities; namespace TestWF
{
//书签有4步
//1.改基类:CodeActivity改为NativeActivity
//2.重写属性CanInduceIdle,改为return true;
//3.修改Execute方法的传入参数类型CodeActivityContext改为NativeActivityContext
//4.利用context.CreateBookmark(text,new BookmarkCallback(MyCallBack));创建书签
public sealed class BookMarkActivity : NativeActivity
{
// 定义一个字符串类型的活动输入参数
public InArgument<string> Text { get; set; } protected override bool CanInduceIdle
{
get
{
return true;
}
} // 如果活动返回值,则从 CodeActivity<TResult>
// 派生并从 Execute 方法返回该值。
protected override void Execute(NativeActivityContext context)
{
// 获取 Text 输入参数的运行时值
//string text = context.GetValue(this.Text); context.CreateBookmark("TestWF",MyCallBack);
} private void MyCallBack(NativeActivityContext context, Bookmark bookmark, object value)
{
//可以在书签中操作书签的返回值
}
}
}
3.新建“活动”项,拖出工作流如下图所示:

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

4.在项目中添加app.config配置文件,添加连接字符串的appSetting项:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<appSettings>
<add key="conStr" value="Data Source=./;Initial Catalog=MyOA;Integrated Security=true; "/>
</appSettings>
</configuration>
5.Form1窗口的设计:

6.在Form1.cs中添加代码:
using System;
using System.Activities;
using System.Activities.DurableInstancing;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace TestWF
{ public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
textBox1.Text = Clipboard.GetText();
} public static string conStr = ConfigurationManager.AppSettings["conStr"];
private void button3_Click(object sender, EventArgs e)
{
#region 开启工作流代码
//如果你想要使用工作流进行序列化和持久化。
WorkflowApplication application = new WorkflowApplication(new TestActivity()); SqlWorkflowInstanceStore store = new SqlWorkflowInstanceStore(conStr);
//让当前的我们的applicaton实例跟 数据库关联一块
application.InstanceStore = store; //当工作流空闲的时候立即让我们工作流进行卸载,之前先序列化到 咱们的 数据库里面去。 application.PersistableIdle = arg => { return PersistableIdleAction.Unload; };
//当工作流被卸载时显示卸载信息
application.Unloaded += a => { Console.WriteLine("工作流停下来了"); };
application.Run();//启动一个新的线程帮助我们执行工作流。
#endregion
textBox1.Text = application.Id.ToString();
//将工作流的guid粘贴到剪贴板中,以便下一次程序启动时能取到
Clipboard.SetText(textBox1.Text); } private void button2_Click(object sender, EventArgs e)
{
#region 恢复工作流代码
WorkflowApplication application = new WorkflowApplication(new TestActivity()); SqlWorkflowInstanceStore store = new SqlWorkflowInstanceStore(conStr);
//让当前的我们的applicaton实例跟 数据库关联一块
application.InstanceStore = store; //当工作流空闲的时候立即让我们工作流进行卸载,之前先序列化到 咱们的 数据库里面去。
application.PersistableIdle = arg => { return PersistableIdleAction.Unload; }; application.Load(Guid.Parse(textBox1.Text));
application.ResumeBookmark("TestWF","");
#endregion
} }
}
7.运行结果如下图:

当点击“开启工作流”时,提示“请输入金额”,当输入金额回车后由于有书签,工作流停下来被实例化到数据库中程序打印出“工作流停下来了”,再点击“重新开启工作流”,工作流继续运行到其他FinalState状态。
WorkFlow基础实战的更多相关文章
- javamail模拟邮箱功能发送电子邮件-基础实战篇(javamail API电子邮件实例)
引言: JavaMail 是一种可选的.能用于读取.编写和发送电子消息的包 JavaMail jar包下载地址:http://java.sun.com/products/javamail/downlo ...
- MySQL的初次见面礼基础实战篇
[版权申明] http://blog.csdn.net/javazejian/article/details/61614366 出自[zejian的博客] 关联文章: MySQL的初次见面礼基础实战篇 ...
- python基础 实战作业 ---Excel基本读写与数据处理
代码地址如下:http://www.demodashi.com/demo/11650.html 看完本篇需要: 10min 作业练习需要: 0.5h~3h(依练习者对python熟悉程度而定) 看完本 ...
- Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵基础实战
Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵基础实战 Springboot: 2.1.8.RELEASE SpringCloud: Greenwich.SR2 ...
- Linux Capabilities 入门教程:基础实战篇
该系列文章总共分为三篇: Linux Capabilities 入门教程:概念篇 Linux Capabilities 入门教程:基础实战篇 待续... 上篇文章介绍了 Linux capabilit ...
- python基础实战之猜年龄游戏
目录 一.Python基础实战之猜年龄游戏 给定年龄,用户可以猜三次年龄 年龄猜对,让用户选择两次奖励 用户选择两次奖励后可以退出 age = 18 # 答案 count = 0 # 游戏次数控制 p ...
- Capabilities 入门教程:基础实战篇
该系列文章总共分为三篇: Linux Capabilities 入门教程:概念篇 Linux Capabilities 入门教程:基础实战篇 待续... 上篇文章介绍了 Linux capabilit ...
- Nodejs入门级基础+实战
这篇随笔将会按序记录如下内容: NodeJs 简介 安装 NodeJs HTTP 模块.URL 模块 CommonJs 和 Nodejs 中自定义模块 NodeJs FS 模块 利用 HTTP 模块 ...
- Java工程师 基础+实战 完整路线图(详解版)
Java工程师 基础+实战 完整路线图(详解版) Java 基础 Java 是一门纯粹的面向对象的编程语言,所以除了基础语法之外,必须得弄懂它的 oop 特性:封装.继承.多态.此外还有泛型.反射 ...
随机推荐
- testNG-失败用例重跑方法探究
实现IRetryAnalyzer类,重写其中的retry方法public class TestNGRetry implements IRetryAnalyzer { private int retry ...
- 从Stampery到Chronicled,区块链公证业务的实践
Stampery就是这样一家利用比特币区块链技术代替公证人的创业公司,能为所有的敏感文件提供具有法律约束力的证明.可以用Stampery证明任何文件,它能很好地保护知识产权,证明遗嘱.宣誓.合同.家庭 ...
- MySQL高可用方案-PXC环境部署记录
之前梳理了Mysql+Keepalived双主热备高可用操作记录,对于mysql高可用方案,经常用到的的主要有下面三种: 一.基于主从复制的高可用方案:双节点主从 + keepalived 一般来说, ...
- Linux下rsyslog日志收集服务环境部署记录
rsyslog 可以理解为多线程增强版的syslog. 在syslog的基础上扩展了很多其他功能,如数据库支持(MySQL.PostgreSQL.Oracle等).日志内容筛选.定义日志格式模板等.目 ...
- 语音笔记:MFCC
一,传统语音识别体系结构 二,MFCC特征提取 MFCC(Mel-frequency cepstral coefficients):梅尔频率倒谱系数.梅尔频率是基于人耳听觉特性提出来的, 它与Hz频率 ...
- 作业1+2.四则运算(改进后完整版,用python写的)_064121陶源
概述: 用一个星期加上五一的三天假期自学了python,在Mac系统上重新写出了四则运算的程序,编译器是PyCharm,相当于完成了作业2.d)"选一个你从来没有学过的编程语言,试一试实现基 ...
- PHP预防跨站脚本(XSS)攻击且不影响html代码显示效果
什么是XSS 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者往 ...
- FZU软工实践–团队成员交换交接情况
0.前言 本次交接主要是为了之后Beta冲刺工作可以更加顺利而进行的.因为我跟其他队友交互不够方便,而且我们项目当前比较缺做前端的人员,后端功能已基本实现.所以我换出来了.希望大家可以顺顺利利做完一步 ...
- Xshell 使用数字小键盘进行vim 写入操作.
Copy From http://blog.csdn.net/shenzhen206/article/details/51200869 感谢原作者 在putty或xshell上用vi/vim的时候,开 ...
- 转帖: 一份超全超详细的 ADB 用法大全
增加一句 连接 网易mumu模拟器的方法 adb connect 127.0.0.1:7555 一份超全超详细的 ADB 用法大全 2016年08月28日 10:49:41 阅读数:35890 原文 ...