WF4.0:NativeActivity中的错误处理
備注:這篇文章的使用環(huán)境是.NET framework 4.0 RC 1
在WF4中創(chuàng)建native活動時(shí),NativeActivity是非常強(qiáng)大的。其眾多的功能之一是圍繞錯(cuò)誤處理。
調(diào)度子活動的時(shí)的基本錯(cuò)誤處理。
??? 當(dāng)NativeActivity執(zhí)行的時(shí)候,它是通過一個(gè)NativeActivityContext實(shí)例,這個(gè)實(shí)例通過使用ScheduleActivity()函數(shù)來調(diào)度其他活動。ScheduleActivity()函數(shù)有幾個(gè)重載,其中一個(gè)使用了FaultCallback。當(dāng)執(zhí)行被調(diào)度的子活動發(fā)生一些異常時(shí),就會調(diào)用FaultCallback。調(diào)用錯(cuò)誤處理函數(shù)需要一組參數(shù),這些參數(shù)包括NativeActivityFaultContext和未處理的異常。該NativeActivityFaultContext包含一個(gè)用于錯(cuò)誤處理的HandleFault()函數(shù)。考慮到工作流的異步特性,最直接的一個(gè)try / catch塊是行不通。
??? 因此,我希望下面活動能捕獲任何異常,然后繼續(xù)。
?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?????}
不要使用此代碼,它有一個(gè)嚴(yán)重的錯(cuò)誤!
讓我們通過執(zhí)行下面的工作流測試一下這段代碼:
?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?????????}
對于這個(gè)工作流,我期待下面這樣的輸出:
但實(shí)際情況是別的東西,我會收到以下輸出:
?
即使異常被上級捕獲,我們可以看到第二個(gè)內(nèi)部的WriteLine仍然執(zhí)行了!
這種現(xiàn)象讓我們想起了臭名昭著VB6 On Error Resume Next ,當(dāng)某語句出現(xiàn)錯(cuò)誤時(shí),跳過它,執(zhí)行下面一行的代碼。
這并不是我真正期待和希望的。修復(fù)很容易。所需要做的是使用CancelChild()函數(shù)明確取消正在執(zhí)行的子活動。下面是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?????}
本文轉(zhuǎn)自麒麟博客園博客,原文鏈接:http://www.cnblogs.com/zhuqil/archive/2010/03/11/error-handling-in-a-nativeactivity.html,如需轉(zhuǎn)載請自行聯(lián)系原作者
?
總結(jié)
以上是生活随笔為你收集整理的WF4.0:NativeActivity中的错误处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 11_JAVA 11初体验
- 下一篇: java ftp commonsnet_