一、基础示例

  WF4 默认支持SQLServer的持续化,首先要执行目录C:\Windows\Microsoft.NET\Framework\v4.0.30319\SQL\en下的脚本:

  • SqlPersistenceService_Schema.sql
  • SqlPersistenceService_Logic.sql

  还是Bookmark的示例,新建一个工作流如下:

  

  其中,Bookmark代码如下:

    public sealed class Bookmark1<T> : NativeActivity<T>{public InArgument<string> InParam { get; set; }protected override bool CanInduceIdle{get { return true; }}protected override void Execute(NativeActivityContext context){this.Result.Set(context, "结果传出");context.CreateBookmark("Borkmark1", new BookmarkCallback(bookmarkCallback));}//恢复运行时的回调函数void bookmarkCallback(NativeActivityContext context, Bookmark bookmark, object obj){MessageBox.Show("恢复运行,传入的参数是:" + obj);    //接收到的参数this.Result.Set(context, (T)obj);}}

  新建一个Winform程序如下:

  

  代码如下:

    public partial class Form1 : Form{WorkflowApplication instance = null;SqlWorkflowInstanceStore instanceStore = null;InstanceView view;Guid guid = new Guid();public Form1(){InitializeComponent();}public void InitialWorkflowApplication(){instance = new WorkflowApplication(new WorkflowConsoleApplication1.Workflow1());instance.Idle = workflowIdel;   //为挂起绑定事件instance.Completed = workflowCompleted;     //为完成绑定事件instance.Unloaded = unload;string connectionString = "Data Source=CZZ;Initial Catalog=xxoo;Integrated Security=True";instanceStore = new SqlWorkflowInstanceStore(connectionString);view = instanceStore.Execute(instanceStore.CreateInstanceHandle(), new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(30));instanceStore.DefaultInstanceOwner = view.InstanceOwner;instance.InstanceStore = instanceStore;}private void button1_Click(object sender, EventArgs e){//初始化流程实例
            InitialWorkflowApplication();instance.Run();}//持久化private void button3_Click(object sender, EventArgs e){guid = instance.Id;//只有绑定了InstanceStore的工作流才允许卸载
            instance.Unload();}//从数据库加载private void button4_Click(object sender, EventArgs e){//初始化流程实例
            InitialWorkflowApplication();instance.Load(guid);}//从书签处恢复执行private void button2_Click(object sender, EventArgs e){if (instance.GetBookmarks().Count() == 1){BookmarkResumptionResult BRR = instance.ResumeBookmark(instance.GetBookmarks()[0].BookmarkName, "inPut");MessageBox.Show("Bookmark恢复执行:" + BRR.ToString());}}void workflowCompleted(WorkflowApplicationCompletedEventArgs e){MessageBox.Show("完成!");}void workflowIdel(WorkflowApplicationIdleEventArgs e){MessageBox.Show("挂起!");}void unload(WorkflowApplicationEventArgs e){MessageBox.Show("卸载!");}}

  点击启动工作流,流程执行至Bookmark挂起。点击持续化,作为示例,本处直接Unload()了,WF4在Unload之前会持续化一次。同时,数据库中多个表会发现增加了一行。

  如果此时直接,恢复执行。由于工作流已被卸载,所以会报一个错误。所以,应该先点击加载Workflow,此时流程会根据Guid重新装载上次未执行完毕的流程继续执行。

二、SqlWorkflowInstanceStore

  SqlWorkflowInstanceStore是WF4提供的一个类,需要赋值到WorkflowApplication实例的InstanceStore属性。

  里面保存了数据库连接字符串以及流程所有者等信息。

  可用内容如下:

方法/属性 说明
ConnectionString 数据库连接字符串
DefaultInstanceOwner 实例的所有者
HostLockRenewalPeriod 指定时间段,宿主必须在该时间段内续订其在工作流服务实例上的锁
InstanceCompletionAction 工作流实例完成后采取的操作。两个取值:DeleteAll、DeleteNothing(完成后删还是不删)
InstanceEncodingOption 是否必须对实例数据进行压缩
InstanceLockedExceptionAction 当捕获InstanceLockedException时执行的操作
MaxConnectionRetries 获取或设置最大 SQL 连接重试次数,默认值为 4
RunnableInstancesDetectionPeriod 间隔多长时间执行检测任务。
Execute() 持久化命令,需要时供提供程序操作

三、持久化的方式

  有两种方式可以执行持久化。

  1、Unload();卸载,这样WF4会帮助我们持久化一次。

  2、Persist();仅仅执行持久化操作。

instance.Persist();instance.Unload();

  3、persist Activity的方式持久化

  往视图里添加一个persist控件,当流程执行到此步骤就会持久化,不管实例处于何种状态。实际上这也是调用一下instance.Persist();

  

  流程中最好不要带入一些不相关的变量或参数,因为SQLServer自带的持久化是要把这些数据序列化为二进制数据。如果不能序列化(没有加一个Dxxxx什么的标记的对象),则持续化不会生效。

WF4 持久化 第四篇相关推荐

  1. Go实现Raft第四篇:持久化和调优

    女主宣言 今天小编为大家分享一篇关于Golang实现Raft的文章,本篇文章为系列中的第四篇,对Raft中通过添加持久性和一些优化来完成Raft的基本实现.希望能对大家有所帮助. PS:丰富的一线技术 ...

  2. NeurIPS提前看 | 四篇论文,一窥元学习的最新研究进展

    2019 年,NeurIPS 接受与元学习相关的研究论文约有 20 余篇.元学习(Meta-Learning)是近几年的研究热点,其目的是基于少量无标签数据实现快速有效的学习.本文对本次接收的元学习论 ...

  3. spring之旅第四篇-注解配置详解

    spring之旅第四篇-注解配置详解 一.引言 最近因为找工作,导致很长时间没有更新,找工作的时候你会明白浪费的时间后面都是要还的,现在的每一点努力,将来也会给你回报的,但行好事,莫问前程!努力总不会 ...

  4. 深入理解javascript作用域系列第四篇——块作用域

    前面的话 尽管函数作用域是最常见的作用域单元,也是现行大多数javascript最普遍的设计方法,但其他类型的作用域单元也是存在的,并且通过使用其他类型的作用域单元甚至可以实现维护起来更加优秀.简洁的 ...

  5. android 测试工具,Android开源项目第四篇:开发及测试工具篇

    本文为那些不错的Android开源项目第四篇--开发工具篇,**主要介绍Android开发工具和测试工具相关的开源项目**. Android开源项目系列汇总已完成,包括: 1.Buck faceboo ...

  6. Python之路【第十四篇】:AngularJS --暂无内容-待更新

    Python之路[第十四篇]:AngularJS --暂无内容-待更新 转载于:https://www.cnblogs.com/weiman3389/p/6224181.html

  7. 最简单人工智能python_Python人工智能之路 - 第四篇 : jieba gensim 最好别分家之最简单的相似度实现...

    简单的问答已经实现了,那么问题也跟着出现了,我不能确定问题一定是"你叫什么名字",也有可能是"你是谁","你叫啥"之类的,这就引出了人工智能 ...

  8. VULKAN学习笔记-inter教学四篇

    VULKAN学习笔记-inter教学四篇 --交换链相关函数:实例层 vkCreateWin32SurfaceKHR vkDestroySurfaceKHR vkGetPhysicalDeviceSu ...

  9. 【论文相关】盘点AAAI2020中的四篇推荐系统好文

    AAAI中推荐系统的文章并不多,目之所及处仅有四篇.内容上覆盖了评论推荐.多目标推荐以及图神经网络等话题. 本文基于AAAI中的这四篇推荐系统论文,展开瞅一瞅它们都讲了些什么. 第一篇文章:可解释评论 ...

最新文章

  1. 手把手带你复现AI+区块链写码全过程!(附代码视频)
  2. 【Django】@login_required用法简介
  3. c语言编译器内部错误,C++致命错误C1001:编译器中发生内部错误
  4. 理顺 JavaScript (4) - 变量、常量与数据类型
  5. 按照一定策略把网页抓回到搜索引擎服务器的,SEO新手学习:搜索引擎的基本步骤...
  6. 在Linux中切换用户的命令是set,Linux基础命令---切换用户su
  7. 20150204--JS巩固与加强2-01
  8. html布局四个正方形,分享一个css小技巧,实现给正方形的四个角设置小方块的方法...
  9. 阴霾散去,迎来曙光!
  10. linux硬件驱动网站,linux怎么查看已装好硬件驱动
  11. 计算机人工智能领域英文文献,人工智能英文参考文献精选
  12. 2017年校园招聘中国银行、中国邮政储蓄银行、中国移动笔试内容
  13. CSS背景颜色之奇技淫巧
  14. 松翰SN8P2511 SOP8单片机 可代烧录 提供单片机方案开发 单片机解密
  15. 凡客被裁员工“三问陈年” 官方不予回应
  16. hourglass网络详解+pytorch代码
  17. 华为S7706升级到S7700-V200R008C00SPC500版本快速配置记录
  18. 服务器未能保存文件夹,Exchange服务器提示 Event ID 50 Ntfs (Ntfs) {延迟写入失败} Windows 无法保存文件...
  19. java地址簿管理系统
  20. 为什么要学习Node.js

热门文章

  1. 十六款值得关注的NoSQL与NewSQL数据库--转载
  2. yii 验证器类 细说YII验证器
  3. Delphi的实数计算结果中只保留2位小数
  4. 哈佛成功金句25则(看一遍,都会很有收获!)
  5. crt python_SecureCRT Python
  6. 基于 Docker 和 GitLab 的前端自动化部署实践笔记
  7. asp图片截图代码并且利用asp上传图片压缩
  8. matplotlib 的几种柱状图
  9. Spring boot AOP 实现Redis 存储
  10. 在路上---学习篇(一)Python 数据结构和算法 (4) --希尔排序、归并排序