WF4.0:NativeActivity中的錯誤處理

備注:這篇文章的使用環境是.NET framework 4.0 RC 1

在WF4中創建native活動時,NativeActivity是非常強大的。其眾多的功能之一是圍繞錯誤處理。

調度子活動的時的基本錯誤處理。

??? 當NativeActivity執行的時候,它是通過一個NativeActivityContext實例,這個實例通過使用ScheduleActivity()函數來調度其他活動。ScheduleActivity()函數有幾個重載,其中一個使用了FaultCallback。當執行被調度的子活動發生一些異常時,就會調用FaultCallback。調用錯誤處理函數需要一組參數,這些參數包括NativeActivityFaultContext和未處理的異常。該NativeActivityFaultContext包含一個用于錯誤處理的HandleFault()函數。考慮到工作流的異步特性,最直接的一個try / catch塊是行不通。

??? 因此,我希望下面活動能捕獲任何異常,然后繼續。

復制代碼
?1?????public?sealed?class?MyActivity?:?NativeActivity?
?2?????{
?3?????????public?Activity?Body?{?get;?set;?}?
?4?????????protected?override?void?Execute(NativeActivityContext?context)
?5?????????{?
?6?????????????context.ScheduleActivity(Body,?FaultHandler);
?7?????????}?
?8?????????private?void?FaultHandler(NativeActivityFaultContext?faultContext,?Exception?propagatedException,?ActivityInstance?propagatedFrom)
?9?????????{
10?????????????Console.WriteLine(propagatedException.Message);
11?????????????faultContext.HandleFault();?
12?????????}
13?????}
復制代碼

不要使用此代碼,它有一個嚴重的錯誤!

讓我們通過執行下面的工作流測試一下這段代碼:

復制代碼
?1?????????private?static?Activity?CreateWorkflow()?
?2?????????{?
?3?????????????return?new?Sequence?
?4?????????????{?
?5?????????????????Activities?=
?6?????????????????{?
?7?????????????????????new?WriteLine?{?Text?=?"Start?outer?sequence."?},
?8?????????????????????new?MyActivity?
?9?????????????????????{?
10?????????????????????????Body?=?new?Sequence
11?????????????????????????{?
12?????????????????????????????Activities?=?
13?????????????????????????????{?
14????????????????????????????????new?WriteLine?{?Text?=?"Start?inner?sequence."?},
15????????????????????????????????new?Throw?
16????????????????????????????????{
17????????????????????????????????????Exception?=?new?InArgument<Exception>(ctx?=>?new?DivideByZeroException())
18????????????????????????????????},
19????????????????????????????????new?WriteLine?{?Text?=?"End?inner?sequence."?}?
20?????????????????????????????}
21?????????????????????????}
22?????????????????????},?
23??????????????????????new?WriteLine?{?Text?=?"End?outer?sequence."?}
24?????????????????}?
25?????????????};?
26?????????}
復制代碼

對于這個工作流,我期待下面這樣的輸出:

但實際情況是別的東西,我會收到以下輸出:

?

即使異常被上級捕獲,我們可以看到第二個內部的WriteLine仍然執行了!

這種現象讓我們想起了臭名昭著VB6 On Error Resume Next ,當某語句出現錯誤時,跳過它,執行下面一行的代碼。

這并不是我真正期待和希望的。修復很容易。所需要做的是使用CancelChild()函數明確取消正在執行的子活動。下面是NativeActivity的正確版本。

復制代碼
?1????public?sealed?class?MyActivity?:?NativeActivity?
?2?????{
?3?????????public?Activity?Body?{?get;?set;?}?
?4?????????protected?override?void?Execute(NativeActivityContext?context)
?5?????????{?
?6?????????????context.ScheduleActivity(Body,?FaultHandler);
?7?????????}?
?8?????????private?void?FaultHandler(NativeActivityFaultContext?faultContext,?Exception?propagatedException,?ActivityInstance?propagatedFrom)
?9?????????{
10?????????????Console.WriteLine(propagatedException.Message);
11?????????????faultContext.HandleFault();
12?????????????faultContext.CancelChild(propagatedFrom);
13?????????}
14?????}
復制代碼






本文轉自麒麟博客園博客,原文鏈接:http://www.cnblogs.com/zhuqil/archive/2010/03/11/error-handling-in-a-nativeactivity.html,如需轉載請自行聯系原作者

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453426.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453426.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453426.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

程序員提高建議之踏踏實實“扎馬步”

踏踏實實“扎馬步” 今天無意中看了“校長”的“程序員&司機”&#xff0c;其中談到了關于程序員速成的問題。其實速成班畢業的“系統殺手”早已在遍布大江南北&#xff0c;只是在互聯網時代&#xff0c;互聯網的應用型軟件生命周期越來越短&#xff0c;業務驅動主導…

c語言scanf返回值

1. scanf 函數是有返回值的&#xff0c;它的返回值可以分成三種情況1) 正整數&#xff0c;表示正確輸入參數的個數。例如執行 scanf("%d %d", &a, &b);如果用戶輸入"3 4"&#xff0c;可以正確輸入&#xff0c;返回2&#xff08;正確輸入了兩個變量…

gpgga格式讀取MATLAB,GPS編碼格式及讀取.doc

GPS接收機只要處于工作狀態就會源源不斷地把接收并計算出的GPS導航定位信息通過串口傳送到計算機中。前面的代碼只負責從串口接收數據并將其放置于緩存&#xff0c;在沒有進一步處理之前緩存中是一長串字節流&#xff0c;這些信息在沒有經過分類提取之前是無法加以利用的。因此…

Cadence 電源完整性仿真實踐(二)

轉載于:http://blog.csdn.net/wu20093346/article/details/38050917 通過以上步驟對每個平面進行了單節點分析并觀測了響應曲線&#xff0c;接下來將觀測平面對的目標阻抗是否滿足要求&#xff0c;通過選擇電容器的方法來減小含有電容器阻抗響應曲線中的反諧振波峰。在SigWave窗…

Johnson 全源最短路徑算法

解決單源最短路徑問題&#xff08;Single Source Shortest Paths Problem&#xff09;的算法包括&#xff1a; Dijkstra 單源最短路徑算法&#xff1a;時間復雜度為 O(E VlogV)&#xff0c;要求權值非負&#xff1b; Bellman-Ford 單源最短路徑算法&#xff1a;時間復雜度為 O…

單循環鏈表中設置尾指針比設置頭指針更好的原因

尾指針是指向終端結點的指針&#xff0c;用它來表示單循環鏈表可以使得查找鏈表的開始結點和終端結點都很方便。 設一帶頭結點的單循環鏈表&#xff0c;其尾指針為rear&#xff0c;則開始結點和終端結點的位置分別是rear->next->next和rear,查找時間都是O(1)。 若用頭指…

為何大部分人成不了技術專家?

此文為我在CSDN的新的SNS里看到的&#xff0c;感觸很深&#xff0c;和大家分享一下.里面的許多人的觀點都讓我受益匪淺。 如果你是項目經理&#xff0c;產品經理或者架構師&#xff0c;我真誠邀請你加入 如果你還是學生或者還是初學者&#xff0c;我建議你先等等&#xff0c;…

Machine Learning 學習筆記1 - 基本概念以及各分類

What is machine learning? 并沒有廣泛認可的定義來準確定義機器學習。以下定義均為譯文&#xff0c;若以后有時間&#xff0c;將補充原英文...... 定義1、來自Arthur Samuel&#xff08;上世紀50年代、西洋棋程序&#xff09; 在進行特定編程的情況下給予計算機學習能力的領域…

值傳遞與地址傳遞

值傳遞與地址傳遞的區別&#xff1a;兩者其實傳遞的都是一個內存單元的內容。不同的是&#xff0c;值傳遞傳遞的內容是一個變量的值&#xff0c;得到這個值后&#xff0c;對這個值的修改不能改變原變量的值&#xff1b;而地址傳遞傳遞的是一個變量的地址&#xff0c;得到傳遞的…

蒙特 卡羅方法matlab,蒙特·卡羅方法中的數學之美,你一定不想錯過

原標題&#xff1a;蒙特卡羅方法中的數學之美&#xff0c;你一定不想錯過有方教育——我們致力于為中學生提供學界和業界前沿的學術科研教育內容&#xff0c;幫助學生參加海外科研項目&#xff0c;在提升申請競爭力的同時&#xff0c;獲得領跑優勢。一、概述蒙特卡羅方法(Monte…

【 CDN 最佳實踐】CDN 命中率優化思路

CDN 在靜態資源的加速場景中是將靜態資源緩存在距離客戶端較近的CDN 節點上&#xff0c;然后客戶端訪問該資源即可通過較短的鏈路直接從緩存中獲取資源&#xff0c;而避免再通過較長的鏈路回源獲取靜態資源。因此 CDN的緩存命中率的高低直接影響客戶體驗&#xff0c;而保證較高…

職場新人的入門法則:少想、多做、立即執行!

對于剛進入職場的新人來說&#xff0c;要想在工作中快速獲得成長&#xff0c;唯一辦法就是&#xff1a;“少想&#xff0c;多做&#xff0c;立即執行&#xff01;”。 少想不等于盲目&#xff0c;在保證工作思路絕對清晰的同時&#xff0c;執行力越高&#xff0c;執行速度越快…

Python基礎-time and datetime

一、在Python中&#xff0c;通常有這幾種方式來表示時間&#xff1a; 時間戳格式化的時間字符串元組&#xff08;struct_time&#xff09;共九個元素。由于Python的time模塊實現主要調用C庫&#xff0c;所以各個平臺可能有所不同。1.時間戳&#xff08;timestamp&#xff09;的…

實際應用中帶頭節點的線性鏈表

/*帶頭節點的線性鏈表類型*/ typedef char ElemType//結點類型 typedef struct LNode {char data;struct LNode *next; }*Link,*Position;//鏈表類型 typedef struct {Link head,tail;int len; }LinkList;/**/ /*一些在其他函數定義中會調用的函數*/ /**//*---compare---比較兩…

matlab中歐姆如何表示,在excel中歐姆符號怎么打

在excel中歐姆符號怎么打&#xff0c;相信對于好多熟練用excel的朋友來說&#xff0c;是很簡單不過的&#xff0c;但是對于有些初學者來說&#xff0c;就是菜鳥啦&#xff0c;就有點懵懵懂懂的感覺了&#xff0c;畢竟剛接觸的東西還沒用過嘛。但是&#xff0c;沒關系今天筆者就…

原生js系列之DOM工廠模式

寫在前面 如今&#xff0c;在項目中使用React、Vue等框架作為技術棧已成為一種常態&#xff0c;在享受帶來便利性的同時&#xff0c;也許我們漸漸地遺忘原生js的寫法。 現在&#xff0c;是時候回歸本源&#xff0c;響應原始的召喚了。本文將一步一步帶領大家封裝一套屬于自己的…

武術與軟件設計 - 簡單即是最好

偶然間在公車上看見一個講中國功夫的特輯&#xff0c;說道香港武打片的發展歷程&#xff0c;當然就不得不提起李小龍先生&#xff0c;我們知道他截拳道的威力&#xff0c;這時候我記得在看李小龍傳奇時他所說的一些話&#xff0c;當他和美國一個高手比武后他輸了&#xff0c;最…

matlab的概述,Matlab概述

MATLAB(矩陣實驗室)是數字計算&#xff0c;可視化和編程的第四代高級編程語言和交互式環境。MATLAB是由MathWorks開發的。它允許矩陣操縱&#xff0c;繪制功能和數據; 實現算法; 創建用戶界面; 與其他語言編寫的程序(包括C語言&#xff0c;C&#xff0c;Java和FORTRAN)進行交互…

形參和實參

形參&#xff1a;全稱為“形式參數”是在定義函數名和函數體的時候使用的參數&#xff0c;目的是用來接收調用該函數時傳遞的參數。形參的作用是實現主調函數與被調函數之間的聯系&#xff0c;通常將函數所處理的數據&#xff0c;影響函數功能的因素或者函數處理的結果作為形參…

sizeof和strlen的區別

strlen——get the length of a string.size_t strlen(const char *string);Each ofthese functions returns the number of characters instring, notincluding the terminating null character.//函數返回string里的字符數&#xff0c;不包括終止字符\0sizeofThe sizeof keyw…