一起学WF3.5【4】

上文说因为没有工作流还没有实例化,还不能够运行。接下来我们看看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(“用户取消”);

 

编译,运行,会发现提供的延时值不起作用了。

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、习资料等,我会提供帮助,提供资料,鼓励习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等科竞赛比赛、初期项目立项、习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源习/技术交流/习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值