码迷,mamicode.com
首页 > 其他好文 > 详细

WF4 持久化 <第四篇>

时间:2014-09-25 21:09:07      阅读:252      评论:0      收藏:0      [点我收藏+]

标签:winform   style   blog   http   color   io   os   ar   for   

一、基础示例

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

  • SqlPersistenceService_Schema.sql
  • SqlPersistenceService_Logic.sql

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

  bubuko.com,布布扣

  其中,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程序如下:

  bubuko.com,布布扣

  代码如下:

    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() 持久化命令,需要时供提供程序操作

 

WF4 持久化 <第四篇>

标签:winform   style   blog   http   color   io   os   ar   for   

原文地址:http://www.cnblogs.com/kissdodog/p/3993405.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!