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