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。 |
總結
以上是生活随笔為你收集整理的Activity功能控件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 纪念币和纪念钞可以流通吗
- 下一篇: Activity容器控件