上文说因为没有工作流还没有实例化,还不能够运行。接下来我们看看workflow实例。
一、什么是workflow实例
一个workflow实例由一个或多个活动组成。由“workflow definition”作为其他活动的容器,也被称为“primary activity”或“root activity”。
WF集成了图形界面设计器,可以帮助我们将workflow集成到ASP.NET Web Forms、Windows Forms或WPF应用中。
Workflow实例可以开始执行、运行,遇到终止条件时终止。它只有一个正常的启动位置,但有一个或多个正常的位置终止。
有时一个workflow处理过程会执行很长时间。
workflow实例和组成实例的活动是workflow处理过程中的重要组成部分。WF为workflow实例的创建及执行提供了强大的支持。我们首先要看看WorkflowInstance对象。
二、 WorkflowInsance对象
WorkflowInstance属性:
属性 | 功能 |
InstanceId | 得到workflow 实例的唯一标识(一个 Guid) |
WorkflowRuntime | 得到本workflow 实例的WorkflowRuntime |
WorkflowInstance方法:
方法 | 功能 |
ApplyWorkflowChanges | 通过 WorkflowChanges 对象申请对 workflow 实例进行更改。这允许你在 workflow 执行时修改它(增加、移出或更改活动),当动态的更改实施时,workflow 实例会被暂停。 |
GetWorkflowDefinition | 检索本 workflow 实例的根(root)活动。 |
Resume | 恢复执行先前被暂停的 workflow 实例。假如 workflow 实例并未处于暂停状态,则不做任何事情。假如 workflow 实例处在暂停状态,workflow 运行时就会在 workflow 实例刚被恢复后触发WorkflowResumed 事件。 |
Start | 启动一个 workflow 实例的执行,在这个 workflow 实例根活动上调用 ExecuteActivity。假如 Start 发生异常,它通过调用 Terminate终止这个 workflow 实例,并附加异常相关信息作为终止的原因。 |
Suspend | 同步暂停本 workflow 实例。假如 workflow 实例本就处于暂停状态,则不做任何事情。假如 workflow 实 例正在运行,则 workflow 运行时就暂停该实例,然后设置 SuspendOrTerminateInfoProperty(说明原因)并进入Suspend,触发 WorkflowSuspended 事件。 |
Terminate | workflow 运行时就终止这个实例并试图持久化实例的最终状态。然后 WorkflowInstance 设置 SuspendOrTerminateInfoProperty(说明原因)并进入Terminate。最后,它触发 WorkflowTerminated 事件并把终止原因传到 WorkflowTerminateException 中的Message 属性并包含到 WorkflowTerminatedEventArgs 事件参数中。另外,假如在持久化时发生异常,workflow 运行时取而代之地就把异常传到WorkflowTerminatedEventArgs 事件参数中。 |
以后会对工作流实例更多的方法进行说明。
三、 启动一个工作流实例
我们将添加一个包含延时的顺序工作流,并在延时前后弹出消息对话框作提示。我们可以继续使用上节的例子。
打开workflow1.cs的视图设计界面,从工具箱添加如下图活动,即两个codeActivity和一个delayActivity。
并在两个codeActivity的属性中,找到二者的ExecuteCode属性并分别添加如下代码:
private void PreDelayMessage(objectsender, EventArgs e)
{
MessageBox.Show("正在执行延时前的代码");
}
private void PostDelayMessage(objectsender, EventArgs e)
{
MessageBox.Show("正在执行延时后的代码");
}
并把delayActivity活动的TimeoutDuration属性设为10。
编译后,程序依然挂起,因为我们还没有要求主程序去执行它。这将用到WorkflowRuntime对象。
在Console.WriteLine("等待 workflow 完成。");后添加如下代码:
WorkflowInstanceinstance = workflowRuntime.CreateWorkflow(typeof(LongRunningWorkflow.Workflow1));
instance.Start();
我们使用WorkflowRuntime对象和CreateWorkflow方法创建了一个我们想去执行的workflow实例。在得到了一个WorkflowInstance对象后,调用Start方法初始化workflow。
四、 启动带参数的workflow实例
带输入参数启动的Workflow实例把接收到的参数和相关的公有属性对应起来。
为了设置延时值,把它做为参数输入,我们创建一个公有的属性,名为“Delay”。
作如下定义:
private Int32 _delay = 10;
public Int32 Delay
{
get { return _delay; }
set
{
if (value < 0 || value >120)
value = 10;
if (ExecutionStatus ==ActivityExecutionStatus.Initialized)
{
_delay = value;
delayActivity1.TimeoutDuration = new TimeSpan(0, 0, _delay);
}
}
}
上述代码限定了延时的取值范围,并禁止在运行中修改。
在workflowRuntime.WorkflowTerminated+= newEventHandler<WorkflowTerminatedEventArgs>(workflowRuntime_WorkflowTerminated);后添加如下代码:
Int32 delay = 0;
stringval = args.Length > 0? args[0] :"10";
if(!Int32.TryParse(val, outdelay))
{
Console.WriteLine("你必须输入一个整形值!");
return;
}
Dictionary<string, object> parms =newDictionary<string, object>();
把WorkflowInstanceinstance = workflowRuntime.CreateWorkflow(typeof(LongRunningWorkflow.Workflow1));改为:
WorkflowInstance instance =workflowRuntime.CreateWorkflow(typeof(LongRunningWorkflow.Workflow1), parms);
编译,运行。记得在后面带上参数。可以看到不同的延时效果。
五、Workflow实例的状态
很多时候我们需要确定workflow状态。在基类Activity中有一个ExcutionStatus,是ActivityExecutionStatus枚举的一个成员。下表列出了它的枚举值。
属性 | 功能 |
Canceling | 活动正在取消中。 |
Closed | 活动已被关闭。 |
Compensating | 活动处于补偿状态。 |
Executing | 活动当前正在运行。 |
Faulting | 活动已产生并维持一个异常。 |
Initialized | 活动已被初始化但还未运行。 |
因为workflow definition是一个活动,确定了它的状态就确定了整个实例的状态。
在program.cs中的Main方法,在instance.Start()下添加如下代码:
Console.WriteLine("workflow 处在:{0}状态。", instance.GetWorkflowDefiniton().ExecutionStatus.ToString());
通过使用Terminate方法终止一个workflow实例。假如在应用中添加了WorkflowTerminated的实例处理,可以从Exception的Message属性获取终止原因。Exception被包装到WorkflowTerminatedEventArgs中,并传入WorkflowTerminated的事件处理程序中。
在刚添加的代码上添加 instance.Terminate(“用户取消”);
编译,运行,会发现提供的延时值不起作用了。