Activity功能控件
CodeActivity
CodeActivity提供了一個(gè)ExecuteCode事件,可綁定一個(gè)(ByVal sender As System.Object, ByVal e As System.EventArgs)格式的Sub方法,每當(dāng)流程運(yùn)行到該結(jié)點(diǎn)時(shí)行綁定到該事件的方法
ExecuteCode事件
流程到該結(jié)點(diǎn)時(shí)要執(zhí)行的代碼
| Private Sub code_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs) End Sub |
| 如果綁定不上,或要改變綁定時(shí)報(bào)錯(cuò),可在Workflow1.designer.vb中的手寫綁定代碼 |
提供了一個(gè)延時(shí)的結(jié)點(diǎn),Delay結(jié)點(diǎn)就能使實(shí)例進(jìn)入idle狀態(tài),并觸發(fā)引擎的WorkflowIdled事件
已被SqlWorkflowPersistenceService持久化的,Delay狀態(tài)的實(shí)例,在到時(shí)后會(huì)被刷回引擎,其他狀態(tài)的實(shí)例不會(huì)被刷回引擎
SqlWorkflowPersistenceService會(huì)不停的刷InstanceState表,發(fā)現(xiàn)有狀態(tài)為Delay的實(shí)例,且nextTimer小于當(dāng)前時(shí)間,就執(zhí)行他。
SqlWorkflowPersistenceService類的一個(gè)構(gòu)造函數(shù),可設(shè)置引如何對(duì)待進(jìn)入idle狀態(tài)的實(shí)例,為真時(shí),當(dāng)工作流進(jìn)入到一個(gè)idle狀態(tài)時(shí)自動(dòng)unload它
更多的見自定義持久化類的Delay與idle部分
TimeoutDuration 屬性
要等待的時(shí)間值
| 格式1: 23:59:59 格式2: 500.23.59.59 |
InitializeTimeoutDuration 事件
開始進(jìn)入等待狀態(tài)前發(fā)生該事件
| (object sender, EventArgs e) |
CallExternalMethodActivity
在工作流內(nèi)部調(diào)用外部方法
1.InterfaceType要綁定到標(biāo)記為[System.Workflow.Activities.ExternalDataExchange()]的一個(gè)接口上
2.MethodName 要綁定到該接口聲明的一個(gè)方法
3.引擎中要加載ExternalDataExchange服務(wù)
4.ExternalDataExchange服務(wù),要加載實(shí)現(xiàn)[1]所綁定接口類的實(shí)例
5.運(yùn)行到CallExternalMethodActivity結(jié)點(diǎn)后自動(dòng)調(diào)用實(shí)例中的方法。用參數(shù)映射中的設(shè)定傳參,得到返回值
6.參數(shù)映射見
MethodInvoking事件
開始調(diào)用外部方法時(shí)發(fā)生該事件
| ?private void callExternalMethodActivity1_MethodInvoking(object sender, EventArgs e) ?{//方法調(diào)用時(shí)?? } |
| WorkflowRuntime實(shí)例 方法:AddService(obj) |
| ExternalDataExchangeService實(shí)例 方法:AddService(obj) |
| 實(shí)?? 例 |
| [System.Workflow.Activities.ExternalDataExchange()] public interface 外部方法映射接口 {string? 一個(gè)外部方法(string? wxd, string lzm);} |
| ?public class 功能類_外部方法 : 外部方法映射接口 {? public string?? 一個(gè)外部方法(string? wxd, string lzm) ??????? { return wxd + lzm;}??? } |
HandleExternalEventActivity
綁定外部事件(指工作流內(nèi)部事件在宿主中觸發(fā))
1.InterfaceType要綁定到標(biāo)記為[System.Workflow.Activities.ExternalDataExchange()]的一個(gè)接口上
2.EventName 要綁定到該接口聲明的一個(gè)事件,事件格式最好與Invoked的事件簽名一至
| (object sender, ExternalDataEventArgs e) |
| e參數(shù)可以通過重寫ExternalDataEventArgs類進(jìn)行括充,下例就重寫了 (事件用的是2.0的寫法,也可以使用傳統(tǒng)寫法) |
3.引擎中要加載ExternalDataExchange服務(wù)
4.ExternalDataExchange服務(wù),要加載實(shí)現(xiàn)[1]所綁定接口類的實(shí)例
5.運(yùn)行到HandleExternalEventActivity結(jié)點(diǎn)后,會(huì)進(jìn)入idle狀態(tài),蘇酲時(shí)間為9999-12-31
6.只有當(dāng)宿主中觸發(fā)綁定的事件后才會(huì)繼續(xù)向下運(yùn)行。
7.下例中如果所傳的“InstanceId”與當(dāng)前實(shí)例的[InstanceId]不一至?xí)r會(huì)報(bào)錯(cuò)
8.觸發(fā)事件時(shí)的兩個(gè)參數(shù)值會(huì)傳入HandleExternalEventActivity的Invoked事件對(duì)應(yīng)的參數(shù),也會(huì)賦給參數(shù)映射中的設(shè)定
9.觸發(fā)事件時(shí) 對(duì)象.觸發(fā)事件("發(fā)送對(duì)象", 當(dāng)前操作的實(shí)例.InstanceId ??) ????將要觸發(fā)該事件的工作流實(shí)例的GUID號(hào)傳入是非常重要的,因?yàn)橐嬷锌赡苡卸鄠€(gè)實(shí)例在等待該事件,發(fā)送工作流實(shí)例的GUID號(hào)可以告訴引擎是要觸發(fā)那一個(gè)實(shí)例事件
10.在實(shí)例掛起或沒到HandleExternalEventActivity結(jié)點(diǎn)時(shí),也可以在外部觸發(fā)事件,這時(shí)當(dāng)實(shí)例運(yùn)行到該結(jié)點(diǎn)時(shí)HandleExternalEventActivity就可直接過去,而不用再觸發(fā)了
Invoked事件
外部事件發(fā)生后發(fā)生該事件
| private void handleExternalEvent_Invoked(object sender, ExternalDataEventArgs e) e.InstanceId e.Identity e.WaitForIdle e.WorkHandler e.WorkItem |
| 該事件中的兩個(gè)參數(shù)與參數(shù)映射中的設(shè)定是一樣的 可進(jìn)行類型轉(zhuǎn)換以得到自定義的擴(kuò)充:? (事件標(biāo)志)e).自定義存值 |
| public class 功能類_外部事件: 外部事件映射接口? { public event EventHandler<事件標(biāo)志> 一個(gè)外部事件; public string 自定義存值; public void 觸發(fā)事件(object sender ,Guid id) ?? {? 事件標(biāo)志 e = new 事件標(biāo)志(id); e.自定義存值 = 自定義存值; ???? ??一個(gè)外部事件(sender, e);}?????????????? } |
| [System.Workflow.Activities.ExternalDataExchange()] public interface 外部事件映射接口 {event System.EventHandler<事件標(biāo)志> 一個(gè)外部事件;} |
| 宿主 |
| [Serializable()] public class 事件標(biāo)志:Workflow.Activities.ExternalDataEventArgs? { private Guid 實(shí)例GUID_存值; public 事件標(biāo)志(Guid instanceId):base(instanceId) {this.實(shí)例GUID_存值=instanceId; } public? Guid 實(shí)例GUID {get{return this.實(shí)例GUID_存值;} set{this.實(shí)例GUID_存值 = value;}} public string 自定義存值;???????????????????????????????????????? } //可以重寫ExternalDataEventArgs,以實(shí)與在事件參數(shù)中傳遞自定義信息 |
| WorkflowRuntime實(shí)例 方法:AddService(obj) |
| ExternalDataExchangeService實(shí)例 方法:AddService(obj) |
| 對(duì)象 |
| ?'觸發(fā)外部事件的一個(gè)方法 ???? 對(duì)象.自定義存值= "wxd" ?'[發(fā)送對(duì)象]:不能將[當(dāng)前操作的實(shí)例.WorkflowRuntime]發(fā)回去 對(duì)象.觸發(fā)事件("發(fā)送對(duì)象", 當(dāng)前操作的實(shí)例.InstanceId) |
結(jié)束外部事件的等待狀態(tài)
1.設(shè)計(jì)工作流時(shí),使用一個(gè)listen監(jiān)聽,其中一個(gè)分支是HandleExternalEventActivity,另一個(gè)分支是Delay,在Delay中設(shè)定一個(gè)等待超時(shí)
2.在引擎中直接將實(shí)例終止
3.對(duì)事件隊(duì)列發(fā)送終止信息
| ??????? Dim 隊(duì)列集合As ReadOnlyCollection(Of WorkflowQueueInfo) = 當(dāng)前操作的實(shí)例.GetWorkflowQueueData() ??????? For Each 隊(duì)列As WorkflowQueueInfo In 隊(duì)列集合 ??????????? Dim 事件隊(duì)例As EventQueueName = TryCast(隊(duì)列.QueueName, EventQueueName) ??????????? If 事件隊(duì)例IsNot Nothing Then ??????????????? 'handleExternalEventActivity1控件為假時(shí),不會(huì)執(zhí)行到該單元 ??????????????? 'get activity that is waiting for event ??????????????? '獲得到activity以等侍事件 ??????????????? Dim 阻塞的Activity As ReadOnlyCollection(Of String) = 隊(duì)列.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 ??????????????? '這個(gè)事件從來不會(huì)到達(dá)eg , ??????????????? '讓我們發(fā)送一個(gè)錯(cuò)誤到這個(gè)隊(duì)列 ??????????????? '它將綁定到exception handler,這是workFlow的一種模式 ??????????????? '或者運(yùn)行時(shí)將unwind[解開,打開]運(yùn)行補(bǔ)償綁定,并且退出工作流 ??????????????? Console.WriteLine(事件隊(duì)例.MethodName) ??????????????? Console.WriteLine(事件隊(duì)例.InterfaceType.Name) ??????????????? Dim ec As New Exception("wxd添加的自定義錯(cuò)誤信息") ??????????????? 當(dāng)前操作的實(shí)例.EnqueueItem(隊(duì)列.QueueName, ec, Nothing, Nothing) ????????? End If ??????? Next |
SuspendActivity
一個(gè)掛起流程的結(jié)點(diǎn),與在宿主中使用[實(shí)例.Suspend("參數(shù)")]效果一樣
該結(jié)點(diǎn)與[實(shí)例.Suspend("參數(shù)")]一樣會(huì)觸發(fā)引擎的WorkflowSuspended事件
引擎的WorkflowSuspended事件的 e.Error就是Error屬性設(shè)置的值
Error屬性
就是[實(shí)例.Suspend("參數(shù)")]中的參數(shù)值,該”參數(shù)值”可以被WorkflowSuspended事件與跟蹤服務(wù)接收
引擎的WorkflowSuspended事件的 e.Error就是Error屬性設(shè)置的值
terminateActivity
一個(gè)終止流程的結(jié)點(diǎn),,與在宿主中使用[實(shí)例.Terminate("該實(shí)例已被宿主Terminate")]效果一樣
該結(jié)點(diǎn)與[實(shí)例.Terminate("該實(shí)例已被宿主Terminate")]一樣會(huì)觸發(fā)引擎的OnWorkflowTerminated事件,
引擎的OnWorkflowTerminated事件的e.Exception.Message就是Error屬性設(shè)置的值
Error屬性
就是[實(shí)例.Terminate("參數(shù)")]中的參數(shù)值,該”參數(shù)值”可以被OnWorkflowTerminated事件與跟蹤服務(wù)接收
引擎的OnWorkflowTerminated事件的e.Exception.Message就是Error屬性設(shè)置的值
ThrowActivity
1.一個(gè)拋出異常的結(jié)點(diǎn)
2.該結(jié)點(diǎn)將一個(gè)自定義的異常對(duì)象拋給引擎,會(huì)觸發(fā)引擎的OnWorkflowTerminated事件
3.引擎OnWorkflowTerminated事件的e.Exception可得到
4.使用該結(jié)點(diǎn),與在代碼中使用[throw 異常] 的不同之處是[throw 異常] 在調(diào)試狀態(tài)會(huì)使編譯器停屏
| [Serializable] ? public? class 異常A : System.Exception ??? { ??????? public 異常A(string s)? : base(s) ??????? { ??????? } } |
| public 異常A Fault1 = new 工作流模板.異常A("一個(gè)自定義的異常"); |
InvokeWebServiceActivity
調(diào)用WebService方法
屬性
| ProxyClass | SoapHttpClientProcotol 類對(duì)實(shí)要調(diào)用的Webservice的實(shí)現(xiàn) 當(dāng)添加該控件時(shí),會(huì)出現(xiàn)一個(gè)添加Web引用的向?qū)?#xff0c;可在向?qū)е型瓿蓪?duì)SoapHttpClientProcotol的實(shí)現(xiàn) |
| URL | 要調(diào)用的Web Service的URL |
| MethodName | 調(diào)用Web Services的方法名 設(shè)計(jì)器會(huì)跟據(jù)該方法參數(shù)出現(xiàn)對(duì)應(yīng)的[參數(shù)映射向?qū) |
事件
| Invoked | 執(zhí)行完成后 |
| Invoking | 要執(zhí)行時(shí) |
SessionId
| WF 支持在一個(gè)Workflow中通過cookie 支持多個(gè)InvokeWebServiceActivity的調(diào)用在一個(gè)Session中 這時(shí)候,你需要設(shè)置InvokeWebServiceActivity的SessionId屬性,如果你將一個(gè)Workflow中的多個(gè)InvokeWebServiceActivity的SessionId 設(shè)置成相同的,那么WF在調(diào)用和執(zhí)行完第一個(gè)InvokeWebServiceActivity 之后,也會(huì)以相同的cookie 傳回給Web Service的服務(wù)器端,以確保服務(wù)器端能夠跟蹤到客戶端的情況。SessionId 是一個(gè)字符串,如果是空字符串,則表示會(huì)啟用一個(gè)新的Session。 |
總結(jié)
以上是生活随笔為你收集整理的Activity功能控件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 纪念币和纪念钞可以流通吗
- 下一篇: Activity容器控件