工作流编程循序渐进(1:代码活动与时间延迟活动)
作者 朱先忠
创建控制台顺序工作流示例程序框架
请遵循如下步骤创建一个控制台顺序工作流示例程序:
1. 启动VS2008,单击菜单”文件“|”新建“|”项目“,创建一个名字为CodeAndDelay的控制台顺序工作流示例程序,见下图。
2.之后,系统自动打开工作流设计器界面,如图所示。
3. 从工具箱中依次拖动Code,Delay,Code三个活动到图中右侧的汉字提示处,得到如图所示的情形。
此时,图中的三个活动相关参数都没有经过设置,下面将设置有关参数。
为活动创建事件或属性
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运行控制台程序,一般顺利的话,将得到如下图所示运行时快照。
完全合乎意料的结果,一切尽在不言中!
备注(FROM MSDN)
DelayActivity
活动有一个InitializeTimeoutDuration 事件,它发生在
在超时持续时间开始之前发生。对于此事件,微软的建议是:不应使用此事件来设置 DelayActivity 的 TimeoutDuration。而应在工作流的
InitializeComponent 方法中设置超时持续时间。