WF4.0持久化

一、创建数据库

      工作流实例怎样保存到数据库呢?首先SQL Server已经提供一套专门存储工作流实例的数据库,当你安装上sql server后它就已经存在sql脚本,脚本就是的目录是:%WINDIR%\Microsoft.NET\Framework\v4.xxx\SQL\EN 。

两个数据库是:
  1. SqlWorkflowInstanceStoreSchema.sql

  2. SqlWorkflowInstanceStoreLogic.sql

    找到后执行,得到以下数据库:


    WF4.0持久化_第1张图片


    二、用代码实现持久化工作流实例

    为使用 WorkflowApplication 的自承载工作流启用持久性

    可通过使用 SqlWorkflowInstanceStore 对象模型为以编程方式使用 WorkflowApplication 的自承载工作流启用持久性。

    用demo说明:

    首先是工作流流程代码:


    <span style="font-size:18px;">namespace WFDurable
    {
        /// <summary>
        /// 输入两个整数,输出这两个整数之和
        /// </summary>
        public sealed class TestActivity : CodeActivity
        {
            // 定义一个整数类型的活动输入参数
            public InArgument<int> number1 { get; set; }
            public InArgument<int> number2 { get; set; }
            //定义一个整数类型的活动输出参数
            public OutArgument<int> outNumber { get; set; }
            // 如果活动返回值,则从 CodeActivity<TResult>
            // 派生并从 Execute 方法返回该值。
            protected override void Execute(CodeActivityContext context)
            {
                // 获取 Text 输入参数的运行时值
                int num1 = context.GetValue(this.number1);
                int num2 = context.GetValue(this.number2);
                context.SetValue(outNumber, num1 + num2);
            }
        }
    }  </span>



    创建一个windows窗体,如下:


    源代码是:


    <span style="font-size:18px;">using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Activities;
    using System.Activities.DurableInstancing;
    using System.Runtime.DurableInstancing;
    namespace WFDurable
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            private void button1_Click(object sender, EventArgs e)
            {
                
                //SqlWorkflowInstanceStore类派生自持久性功能的抽象 System.Runtime.Persistence.InstanceStore 类,并提供实现以允许将实例状态信息保存到SQL Server 2005 或 SQL Server 2008 数据库,或从该数据库中加载实例状态信息。
                //1.流程数据库持久化对象准备
                SqlWorkflowInstanceStore instanceStore = new SqlWorkflowInstanceStore("server=.;database=countersignatureDB;uid=sa;pwd=123456");
                //2.Execute是异步持久化到数据库第一个参数是实例句柄,第二个参数是需要执行的命令,第三个参数是持久化数据库超时时间返回值为InstanceView视图,包括持久化的数据的实例数据(摘自MSDN)
                InstanceView view = instanceStore.Execute(instanceStore.CreateInstanceHandle(), new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(10));
                //3.设置实例的默认所有者,SqlWorkflowInstanceStore默认只使用单一的WorkflowApplication.当使用多个工作流的时候会发生一个异常,SqlWorkflowInstanceStore does not support creating more than one lock owner concurrently. Consider setting InstanceStore.DefaultInstanceOwner to share the store among many applications.当设置这个属性的时候不会有这个问题了。如果确认只有一个工作流时也必须把DefaultInstanceOwner设置为Null,否则垃圾回收器可能不会回收这块内存。(MSND说的是可能)
                instanceStore.DefaultInstanceOwner = view.InstanceOwner;
                //4.1实例化一个活动
                Activity activity = new TestActivity();
                //4.2创建流程实例并传入参数
                WorkflowApplication application = new WorkflowApplication(activity);
                //5.关联流程对象到数据库(countersignatureDB中的InstancesTable表)
                application.InstanceStore = instanceStore;
                //6.把流程实例保存到数据库中
                application.Persist();
                //流程ID显示到文本框。
                txtID.Text = application.Id.ToString();
            }
        }
    }</span>


    其中第二三步骤不是持久化必须的代码。

    执行的效果就是:

    2016-02-19_200703.jpg

    sql.jpg


    WF4.0持久化_第2张图片


WF4.0持久化_第3张图片



以上两幅图证明实例已经存储在数据库中。


参考文章:如何:对工作流和工作流服务启用 SQL 持久性



你可能感兴趣的:(持久化,WF4.0)