Workflow持久化Demo

这篇博客介绍了一个使用NativeActivity而非CodeActivity的Workflow持久化Demo,因为CodeActivity不支持书签功能。NativeActivity提供了更全面的工作流运行时访问权限,通过实现Execute方法编写命令性行为。内容包括状态机工作流设计、Form1窗体设计及其后代代码的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

准备工作:
1、添加System.Activity.DurableInstancing.dll和SystemRuntime.DurableInstanceing.dll的引用。
2、新建数据库WF45GettingStartedTutorial
运行C:\Windows\Microsoft.NET\Framework\v4.0.30319\SQL\en下的

数据库中的表如下:




1、新建14WinFormWFDemo项目,在此项目下新建Form1窗体应用程序,BookMarkDemoCodeActivity代码活动,DemoActivity状态工作流。


2、BookMarkDemoCodeActivity代码活动继承自NativeActivity,而非CodeActivity。并重写Execute方法,CanInduceIdle属性(标示该工作流是否可以停顿)。

默认情况下,代码活动继承于CodeActivity类,而本例中我们使用的是NativeActivity<TResult>,因为CodeActivity<TResult> 并不支持使用书签。 NativeActivity 是一个带有受保护的构造函数的抽象类。 与 CodeActivity 一样, NativeActivity 用于通过实现Execute(NativeActivityContext) 方法来编写命令性行为。 与 CodeActivity 不同的是,通过传递给 Execute(NativeActivityContext) 方法的 NativeActivityContext 对象, NativeActivity 有权访问工作流运行时的所有公开的功能。

在使用ReadInt之前需要重新生成解决方案。

代码如下:

  public sealed class BookMarkDemoCodeActivity : NativeActivity
    {
        // 定义一个字符串类型的活动输入参数
        public OutArgument<int> day { get; set; }

        // 如果活动返回值,则从 CodeActivity<TResult>
        // 派生并从 Execute 方法返回该值。
        protected override void Execute(NativeActivityContext context)
        {
            context.CreateBookmark("Demo",new BookmarkCallback(SetResult));
        }
        //ResultBook将会执行此代码,winForm窗体中的值将会被送入wf中。
        private void SetResult(NativeActivityContext context, Bookmark bookMark, object value)
        {
            context.SetValue(day, Convert.ToInt32(value));
        }
        //wf 可否停顿
        protected override bool CanInduceIdle
        {
            get
            {
                return true;
            }
        }
    }
}


3、状态机工作流的设计



4、Form1窗体的设计



5、Form1后代代码

 

 public partial class Form1 : Form
    {
        bool isCorrent = false;
        public Form1()
        {
            InitializeComponent();
        }
        WorkflowApplication wfApp = null;
        /// <summary>
        /// WorkflowApplication的配置信息
        /// </summary>
        private void Init()
        {
            wfApp = new WorkflowApplication(new BookMarkDemoCodeActivity());
            wfApp.Idle += a =>
            {
                MessageBox.Show("wf 停下了");
                Console.WriteLine("wf 停下了");
            };
            wfApp.PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e2)
            {
                MessageBox.Show("wf 持久化");
                Console.WriteLine("wf 持久化");
                return PersistableIdleAction.Unload;
            };
            wfApp.Unloaded += a =>
            {
                MessageBox.Show("wf 卸载");
                Console.WriteLine("wf 卸载");
            };
            wfApp.OnUnhandledException += a =>
            {
                MessageBox.Show("wf 遇到异常");
                Console.WriteLine("wf 遇到异常");
                return UnhandledExceptionAction.Terminate;
            };
            wfApp.Aborted += a =>
            {
                MessageBox.Show("wf 终止");
                Console.WriteLine("wf 终止");
            };
            wfApp.Completed += a =>
            {
                if (a.CompletionState == ActivityInstanceState.Canceled)
                {
                    Console.WriteLine("Cancled");
                }
                else if (a.CompletionState == ActivityInstanceState.Faulted)
                {
                    Console.WriteLine("Faulted");
                }
                else
                {
                    isCorrent = true;
                }
            };
            //创建一个保存工作流实例的SqlStore对象
            SqlWorkflowInstanceStore store = new SqlWorkflowInstanceStore(@"Data Source=DAN-PC;Initial Catalog=WF45GettingStartedTutorial;Integrated Security=True");

            wfApp.InstanceStore = store;

        }
        private void btnStart_Click(object sender, EventArgs e)
        {
            Init();
            wfApp.Run();
            txtWorkflowID.Text = wfApp.Id.ToString();
            Clipboard.SetText(this.txtWorkflowID.Text);
        }

        private void btnContinnute_Click(object sender, EventArgs e)
        {
            Init();
            wfApp.Load(Guid.Parse(txtWorkflowID.Text.ToString()));
            wfApp.ResumeBookmark("Demo", Convert.ToInt32(this.txtNumber.Text));
        }
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值