且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

工作流编程循序渐进(1:代码活动与时间延迟活动)

更新时间:2021-09-30 20:15:19

工作流编程循序渐进(1:代码活动与时间延迟活动)


作者  朱先忠

创建控制台顺序工作流示例程序框架


请遵循如下步骤创建一个控制台顺序工作流示例程序:
1. 启动VS2008,单击菜单”文件“|”新建“|”项目“,创建一个名字为CodeAndDelay的控制台顺序工作流示例程序,见下图。
工作流编程循序渐进(1:代码活动与时间延迟活动)

2.之后,系统自动打开工作流设计器界面,如图所示。
工作流编程循序渐进(1:代码活动与时间延迟活动)
3. 从工具箱中依次拖动Code,Delay,Code三个活动到图中右侧的汉字提示处,得到如图所示的情形。
工作流编程循序渐进(1:代码活动与时间延迟活动)
此时,图中的三个活动相关参数都没有经过设置,下面将设置有关参数。

为活动创建事件或属性


4. 对于Code活动来说,它相当于普通程序流程图中的一段代码模块。因此,我们可以进入到此活动的ExecuteCode事件中输入相应代码即可。为此,只 要双击图中的图标”codeActivity1“,系统控制转到文件Workflow1.cs中此活动的ExecuteCode事件代码处:

namespace CodeAndDelay
{
    public sealed partial class Workflow1 : SequentialWorkflowActivity
    {
        public Workflow1()
        {
            InitializeComponent();
        }

        private void codeActivity1_ExecuteCode(object sender, EventArgs e)
        {
            //......等待输入你的定制代码
        }
    }

}

创建如下简单代码:

        private void codeActivity1_ExecuteCode(object sender, EventArgs e)
        {
            
Console.WriteLine("\n这里是活动一的执行代码,当前时间为{0}。",DateTime.Now );
        }

5. 对于活动codeActivity2,也按上述过程操作,并创建类似于下面的代码:

        private void codeActivity2_ExecuteCode(object sender, EventArgs e)
        {
            
Console.WriteLine("\n这里是活动二的执行代码,当前时间为{0}。", DateTime.Now);
        }

6. 切换工作流设计器界面,然后单击选择延迟活动图标。在属性窗口中设置属性TimeoutDuration的值为00:00:05(”时:分:秒“格式)。 因为延迟活动仅仅实现一段时间延迟功能,所以,这个活动是非常容易理解的。

至此,完成了整个工作流部分的设计工作。
非常直观简单!最后,别忘记把上面文件保存一下。

最后,我们来看一下控制台主程序是如何创建工作流实例,并启动工作流执行的。切换到
控制台主程序Program.cs。此时,系统已经为我们自动生成了如下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;

namespace CodeAndDelay
{
    class Program
    {
        static void Main(string[] args)
        {
            //......经常在此添加一些初始化代码

            //创建工作流实例,并启动工作流执行。注意:工作流是以异步的独立的工作线程方式执行的
            using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
            {
                AutoResetEvent waitHandle = new AutoResetEvent(false);
                workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) {waitHandle.Set();};
                workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
                {
                    Console.WriteLine(e.Exception.Message);
                    waitHandle.Set();
                };

                WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(CodeAndDelay.Workflow1));
                instance.Start();

                waitHandle.WaitOne();
            }

            //......在此经常执行一些工作流执行后的善后工作

        }
    }
}


注意:有关上面代码中AutoResetEvent事件等的详细讨论将在后续文章中介绍。

观察运行结果

按F5运行控制台程序,一般顺利的话,将得到如下图所示运行时快照。
工作流编程循序渐进(1:代码活动与时间延迟活动)

完全合乎意料的结果,一切尽在不言中!

备注(FROM MSDN)


DelayActivity活动有一个InitializeTimeoutDuration 事件,它发生在
在超时持续时间开始之前发生。对于此事件,微软的建议是:不应使用此事件来设置 DelayActivity 的TimeoutDuration。而应在工作流的 InitializeComponent 方法中设置超时持续时间。














本文转自朱先忠老师51CTO博客,原文链接:http://blog.51cto.com/zhuxianzhong/203300 ,如需转载请自行联系原作者