一起学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(“用户取消”);

 

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

内容概要:本文档详细介绍了Analog Devices公司生产的AD8436真均方根-直流(RMS-to-DC)转换器的技术细节及其应用场景。AD8436由三个独立模块构成:轨到轨FET输入放大器、高动态范围均方根计算内核和精密轨到轨输出放大器。该器件不仅体积小巧、功耗低,而且具有广泛的输入电压范围和快速响应特性。文档涵盖了AD8436的工作原理、配置选项、外部组件选择(如电容)、增益调节、单电源供电、电流互感器配置、接地故障检测、三相电源监测等方面的内容。此外,还特别强调了PCB设计注意事项和误差源分析,旨在帮助工程师更好地理解和应用这款高性能的RMS-DC转换器。 适合人群:从事模拟电路设计的专业工程师和技术人员,尤其是那些需要精确测量交流电信号均方根值的应用开发者。 使用场景及目标:①用于工业自动化、医疗设备、电力监控等领域,实现对交流电压或电流的精准测量;②适用于手持式数字万用表及其他便携式仪器仪表,提供高效的单电源解决方案;③在电流互感器配置中,用于检测微小的电流变化,保障电气安全;④应用于三相电力系统监控,优化建立时间和转换精度。 其他说明:为了确保最佳性能,文档推荐使用高质量的电容器件,并给出了详细的PCB布局指导。同时提醒用户关注电介质吸收和泄漏电流等因素对测量准确性的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值