Activity功能控件

CodeActivity

CodeActivity提供了一个ExecuteCode事件,可绑定一个(ByVal sender As System.Object, ByVal e As System.EventArgs)格式的Sub方法,每当流程运行到该结点时行绑定到该事件的方法

ExecuteCode事件

流程到该结点时要执行的代码

 

Private Sub code_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs)

      

End Sub

 

如果绑定不上,或要改变绑定时报错,可在Workflow1.designer.vb中的手写绑定代码

提供了一个延时的结点,Delay结点就能使实例进入idle状态,并触发引擎的WorkflowIdled事件

已被SqlWorkflowPersistenceService持久化的,Delay状态的实例,在到时后会被刷回引擎,其他状态的实例不会被刷回引擎

SqlWorkflowPersistenceService会不停的刷InstanceState表,发现有状态为Delay的实例,且nextTimer小于当前时间,就执行他。

 

SqlWorkflowPersistenceService类的一个构造函数,可设置引如何对待进入idle状态的实例,为真时,当工作流进入到一个idle状态时自动unload它

更多的见自定义持久化类的Delay与idle部分

TimeoutDuration 属性

要等待的时间值

格式1: 23:59:59

格式2: 500.23.59.59

 

InitializeTimeoutDuration 事件

开始进入等待状态前发生该事件

(object sender, EventArgs e)

 

CallExternalMethodActivity

在工作流内部调用外部方法

 

1.InterfaceType要绑定到标记为[System.Workflow.Activities.ExternalDataExchange()]的一个接口上

2.MethodName 要绑定到该接口声明的一个方法

3.引擎中要加载ExternalDataExchange服务

4.ExternalDataExchange服务,要加载实现[1]所绑定接口类的实例

5.运行到CallExternalMethodActivity结点后自动调用实例中的方法。用参数映射中的设定传参,得到返回值

6.参数映射见

 

MethodInvoking事件

开始调用外部方法时发生该事件

 private void callExternalMethodActivity1_MethodInvoking(object sender, EventArgs e)

 {//方法调用时   }

 

 

WorkflowRuntime实例

方法:AddService(obj)

ExternalDataExchangeService实例

方法:AddService(obj)

实   例

[System.Workflow.Activities.ExternalDataExchange()]

public interface 外部方法映射接口

{string  一个外部方法(string  wxd, string lzm);}

 public class 功能类_外部方法 : 外部方法映射接口

{  public string   一个外部方法(string  wxd, string lzm)

        { return wxd + lzm;}   

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

HandleExternalEventActivity

绑定外部事件(指工作流内部事件在宿主中触发)

 

1.InterfaceType要绑定到标记为[System.Workflow.Activities.ExternalDataExchange()]的一个接口上

2.EventName 要绑定到该接口声明的一个事件,事件格式最好与Invoked的事件签名一至

(object sender, ExternalDataEventArgs e)

e参数可以通过重写ExternalDataEventArgs类进行括充,下例就重写了

(事件用的是2.0的写法,也可以使用传统写法)

 

3.引擎中要加载ExternalDataExchange服务

4.ExternalDataExchange服务,要加载实现[1]所绑定接口类的实例

5.运行到HandleExternalEventActivity结点后,会进入idle状态,苏酲时间为9999-12-31

6.只有当宿主中触发绑定的事件后才会继续向下运行。

7.下例中如果所传的“InstanceId”与当前实例的[InstanceId]不一至时会报错

8.触发事件时的两个参数值会传入HandleExternalEventActivity的Invoked事件对应的参数,也会赋给参数映射中的设定

9.触发事件时 对象.触发事件("发送对象", 当前操作的实例.InstanceId   )     将要触发该事件的工作流实例的GUID号传入是非常重要的,因为引擎中可能有多个实例在等待该事件,发送工作流实例的GUID号可以告诉引擎是要触发那一个实例事件

10.在实例挂起或没到HandleExternalEventActivity结点时,也可以在外部触发事件,这时当实例运行到该结点时HandleExternalEventActivity就可直接过去,而不用再触发了

Invoked事件

外部事件发生后发生该事件

private void handleExternalEvent_Invoked(object sender, ExternalDataEventArgs e)

e.InstanceId

e.Identity

e.WaitForIdle

e.WorkHandler

e.WorkItem

该事件中的两个参数与参数映射中的设定是一样的

可进行类型转换以得到自定义的扩充:  (事件标志)e).自定义存值

 

 

 

 

 

public class 功能类_外部事件: 外部事件映射接口  {

public event EventHandler<事件标志> 一个外部事件;

public string 自定义存值;

public void 触发事件(object sender ,Guid id)

   {  事件标志 e = new 事件标志(id);

e.自定义存值 = 自定义存值;

       一个外部事件(sender, e);}               }

[System.Workflow.Activities.ExternalDataExchange()]

public interface 外部事件映射接口

{event System.EventHandler<事件标志> 一个外部事件;}

宿主

 

[Serializable()]

public class 事件标志:Workflow.Activities.ExternalDataEventArgs  {

private Guid 实例GUID_存值;

public 事件标志(Guid instanceId):base(instanceId)

{this.实例GUID_存值=instanceId; }

public  Guid 实例GUID

{get{return this.实例GUID_存值;} set{this.实例GUID_存值 = value;}}

public string 自定义存值;                                         }

//可以重写ExternalDataEventArgs,以实与在事件参数中传递自定义信息

WorkflowRuntime实例

方法:AddService(obj)

ExternalDataExchangeService实例

方法:AddService(obj)

对象

 '触发外部事件的一个方法

     对象.自定义存值= "wxd"

 '[发送对象]:不能将[当前操作的实例.WorkflowRuntime]发回去

对象.触发事件("发送对象", 当前操作的实例.InstanceId)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

结束外部事件的等待状态

1.设计工作流时,使用一个listen监听,其中一个分支是HandleExternalEventActivity,另一个分支是Delay,在Delay中设定一个等待超时

 

2.在引擎中直接将实例终止

 

3.对事件队列发送终止信息

        Dim 队列集合As ReadOnlyCollection(Of WorkflowQueueInfo) = 当前操作的实例.GetWorkflowQueueData()

        For Each 队列As WorkflowQueueInfo In 队列集合

            Dim 事件队例As EventQueueName = TryCast(队列.QueueName, EventQueueName)

 

            If 事件队例IsNot Nothing Then

                'handleExternalEventActivity1控件为假时,不会执行到该单元

                'get activity that is waiting for event

                '获得到activity以等侍事件

 

                Dim 阻塞的Activity As ReadOnlyCollection(Of String) = 队列.SubscribedActivityNames

 

                '等待事件的控件名

                Console.WriteLine(阻塞的Activity.Item(0).ToString())

 

                ' this event is never going to arrive eg. employee left the company

                ' lets send an exception to this queue

                ' it will either be handled by exception handler that was modeled in workflow

                ' or the runtime will unwind running compensation handlers and exit the workflow

 

                '这个事件从来不会到达eg ,

                '让我们发送一个错误到这个队列

                '它将绑定到exception handler,这是workFlow的一种模式

                '或者运行时将unwind[解开,打开]运行补偿绑定,并且退出工作流

 

                Console.WriteLine(事件队例.MethodName)

                Console.WriteLine(事件队例.InterfaceType.Name)

 

                Dim ec As New Exception("wxd添加的自定义错误信息")

                当前操作的实例.EnqueueItem(队列.QueueName, ec, Nothing, Nothing)

          End If

        Next

 

SuspendActivity

一个挂起流程的结点,与在宿主中使用[实例.Suspend("参数")]效果一样

该结点与[实例.Suspend("参数")]一样会触发引擎的WorkflowSuspended事件

引擎的WorkflowSuspended事件的 e.Error就是Error属性设置的值

Error属性

就是[实例.Suspend("参数")]中的参数值,该”参数值”可以被WorkflowSuspended事件与跟踪服务接收

引擎的WorkflowSuspended事件的 e.Error就是Error属性设置的值

 

 

 

terminateActivity

一个终止流程的结点,,与在宿主中使用[实例.Terminate("该实例已被宿主Terminate")]效果一样

该结点与[实例.Terminate("该实例已被宿主Terminate")]一样会触发引擎的OnWorkflowTerminated事件,

引擎的OnWorkflowTerminated事件的e.Exception.Message就是Error属性设置的值

Error属性

就是[实例.Terminate("参数")]中的参数值,该”参数值”可以被OnWorkflowTerminated事件与跟踪服务接收

引擎的OnWorkflowTerminated事件的e.Exception.Message就是Error属性设置的值

 

 

ThrowActivity

1.一个抛出异常的结点

2.该结点将一个自定义的异常对象抛给引擎,会触发引擎的OnWorkflowTerminated事件

3.引擎OnWorkflowTerminated事件的e.Exception可得到

4.使用该结点,与在代码中使用[throw 异常] 的不同之处是[throw 异常] 在调试状态会使编译器停屏

 

 

 

[Serializable]

  public  class 异常A : System.Exception

    {

        public 异常A(string s)  : base(s)

        {

        }

}

public 异常A Fault1 = new 工作流模板.异常A("一个自定义的异常");

 

 

 

 

 

InvokeWebServiceActivity

调用WebService方法

 

属性

ProxyClass

SoapHttpClientProcotol 类对实要调用的Webservice的实现

当添加该控件时,会出现一个添加Web引用的向导,可在向导中完成对SoapHttpClientProcotol的实现

URL

要调用的Web Service的URL

MethodName

调用Web Services的方法名

设计器会跟据该方法参数出现对应的[参数映射向导]

 

事件

Invoked

执行完成后

Invoking

要执行时

 

SessionId

WF 支持在一个Workflow中通过cookie 支持多个InvokeWebServiceActivity的调用在一个Session中

这时候,你需要设置InvokeWebServiceActivity的SessionId属性,如果你将一个Workflow中的多个InvokeWebServiceActivity的SessionId 设置成相同的,那么WF在调用和执行完第一个InvokeWebServiceActivity 之后,也会以相同的cookie 传回给Web Service的服务器端,以确保服务器端能够跟踪到客户端的情况。SessionId 是一个字符串,如果是空字符串,则表示会启用一个新的Session。

 

 

posted @ 2010-12-19 14:35  左正  阅读(441)  评论(0编辑  收藏  举报