• 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。

  • 相关阅读:
    [LeetCode] 174. Dungeon Game 地牢游戏
    [LeetCode] Binary Search Tree Iterator 二叉搜索树迭代器
    [LeetCode] Excel Sheet Column Title 求Excel表列名称
    [LeetCode] Excel Sheet Column Number 求Excel表列序号
    [LeetCode] 179. Largest Number 最大组合数
    Camera Calibration and 3D Reconstruction
    [LeetCode] 172. Factorial Trailing Zeroes 求阶乘末尾零的个数
    [LeetCode] Find Peak Element 求数组的局部峰值
    Medical Image Processing Conference and Journal 医学图像处理会议与期刊
    [LeetCode] 144. Binary Tree Preorder Traversal 二叉树的先序遍历
  • 原文地址:https://www.cnblogs.com/soundcode/p/1910540.html
Copyright © 2020-2023  润新知