




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
WF4.0基礎(chǔ)篇學(xué)習(xí)筆記WF4.0基礎(chǔ)篇學(xué)習(xí)筆記一開始使用WF創(chuàng)建一個(gè)新的“工作流控制臺(tái)應(yīng)用程序”包含兩部分:用于描述流程結(jié)構(gòu)的一個(gè)XAML文件調(diào)用流程的宿主程序XAML流程結(jié)構(gòu)描述文件<Activity……x:Class=”WorkflowConsoleApplication1.Workflow1”……><WriteLine……Text=”HelloWorld!”/></Activity>WF4.0的流程是由一組活動(dòng)組成的,當(dāng)流程運(yùn)行時(shí),流程內(nèi)的活動(dòng)按一定的順序依次執(zhí)行。其中<Activity></Activity>是這個(gè)流程的根活動(dòng)。<WriteLine/>是WF4.0的一個(gè)內(nèi)置活動(dòng),其功能就是在屏幕打印Text屬性的內(nèi)容。x:Class=”WorkflowConsoleApplication1.Workflow1”則是將XAML文件編譯成.NET類時(shí)所對(duì)應(yīng)的類名。宿主程序WorkflowInvoker.Invoke(newWorkflow1());其中,WorkflowInvoker是一個(gè)用于調(diào)用工作流的功能類,可以使用該類的Invoke靜態(tài)方法調(diào)用流程。Invoke(newWorkflow1())所使用的類就是XAML文件中x:Class=”WorkflowConsoleApplication1.Workflow1”所定義的類名。二Activity介紹及WriteLineActivity的使用活動(dòng)(Activity):工作流中的內(nèi)容是一個(gè)活動(dòng),包括工作流本身。工作流是特殊類型的活動(dòng),它一般允許在其中定義其他活動(dòng),這稱為復(fù)合活動(dòng)。活動(dòng)是一個(gè)最終派生自Activity抽象類的類。類層次結(jié)構(gòu)比Worknow3.x的定義更深,主要類如下圖所示:Activity類是所有工作流活動(dòng)的根,一般從第二層派生自定義活動(dòng)。要?jiǎng)?chuàng)建一個(gè)簡單的活動(dòng),如上面提到的WriteLine活動(dòng),應(yīng)從CodeActivity中派生,因?yàn)檫@個(gè)類有足夠的功能可以輸出數(shù)據(jù)行。執(zhí)行并返回某種形式的結(jié)果的活動(dòng)應(yīng)派生自ActivityWithResult類——注意這里最好使用泛型類Activity<TResult>,因?yàn)樗峁┝艘粋€(gè)強(qiáng)類型化的Result屬性。為了讓活動(dòng)執(zhí)行某個(gè)操作,一般應(yīng)重寫Execute()方法,它根據(jù)所選擇的基類有許多不同的簽名,這些簽名如下表所示?;怑xecute()方法AsyncCodeActivityprotectedabstractIAsyncResultBeginExecute(AsyncCodeActivityContextcontext,AsyncCallbackcallback,Objectstate)protectedabstractvoidEndExecute(AsyncCodeActivityContextcontext,IAsyncResultresult)CodeActivityprotectedabstractvoidExecute(CodeActivityContextcontext)NativeActivityprotectedabstractvoidExecute(NativeActivityContextcontext)AsyncCodeActivity<TResult>protectedabstractIAsyncResultBeginExecute(AsyncCodeActivityContextcontext,AsyncCallbackcallback,Objectstate)protectedabstractTResultEndExecute(AsyncCodeActivityContextcontext,IAsyncResultresult)CodeActivity<TResult>protectedabstractTResultExecute(CodeActivityContextcontext)NativeActivity<TResult>protectedabstractvoidExecute(NativeActivityContextcontext)注意,傳送給Execute()方法的參數(shù)不同,因?yàn)樗褂昧颂囟ㄓ陬愋偷膱?zhí)行上下文參數(shù)。在Workflow3.x中,只使用了一個(gè)ActivityExecutionContext類,而在Workflow4中,可以為不同類別的活動(dòng)使用不同的上下文。主要區(qū)別是,與NativeActivityContext相比,CodeActivityContext與派生的AsyncCodeActivityContext的功能有限。這說明,派生自CodeActivity和AsyncCodeActivity的活動(dòng)可以執(zhí)行的操作遠(yuǎn)遠(yuǎn)少于它們的容器。例如,前面提到的WriteLine活動(dòng)只需寫入控制臺(tái),因此,它不需要訪問其運(yùn)行庫環(huán)境。更復(fù)雜的活動(dòng)需要調(diào)度其他子活動(dòng),或與其他系統(tǒng)通信,此時(shí)就需要從NativeActivity中派生,以訪問完整的運(yùn)行庫。WF提供了許多標(biāo)準(zhǔn)活動(dòng),下面幾節(jié)將介紹其中一些活動(dòng)的示例和使用這些活動(dòng)的場合。Workflow4使用3個(gè)主要的程序集:System.Activities.dll、System.Activities.Core.Presentation.dll和System.Activities.Presentation.dllWriteLine:將指定的字符串寫入指定TextWriter對(duì)象。類名:System.Activities.Statements.WriteLine程序集:System.Activities(在System.Activities.dll中) 語法:[ContentPropertyAttribute("Text")]publicsealedclassWriteLine:CodeActivity 屬性:Text屬性:要寫入的文本。語法:publicInArgument<string>Text{get;set;}TextWriter屬性:要向其中寫入Text的TextWriter。語法:publicInArgument<TextWriter>TextWriter{get;set;}三流程實(shí)例WorkflowApplication與設(shè)計(jì)WF程序的基本原則WorkflowInvoker類是Workflow4.0新增的,它允許同步調(diào)用工作流,WorkflowInvoker類的同步功能非常適用于運(yùn)行短時(shí)間的工作流,以響應(yīng)某些UI動(dòng)作——可以使用工作流啟用或禁用UI的某些元素。盡管WorkflowInvoker類對(duì)于同步執(zhí)行工作流很有用,但我們可能需要長時(shí)間運(yùn)行的工作流,它們可以持久化到數(shù)據(jù)庫中,在將來的某個(gè)時(shí)刻需要提取出來。此時(shí)應(yīng)使用WorkflowApplication類。WorkflowApplication類為單個(gè)工作流實(shí)例提供宿主。它是由工作流運(yùn)行時(shí)管理的實(shí)際工作流實(shí)例的代理。WorkflowApplication的用戶可以通過調(diào)用WorkflowApplication對(duì)象中的適當(dāng)方法,指示工作流運(yùn)行時(shí)在工作流實(shí)例上執(zhí)行操作。如果請(qǐng)求的操作無效,則引發(fā)異常。使用WorkflowApplication,可以執(zhí)行以下任務(wù):●創(chuàng)建新的工作流實(shí)例,或從實(shí)例存儲(chǔ)區(qū)中加載工作流實(shí)例?!裉峁U(kuò)展以供工作流實(shí)例內(nèi)的活動(dòng)使用?!窨刂乒ぷ髁鲗?shí)例的執(zhí)行?!窕謴?fù)由工作流實(shí)例內(nèi)的活動(dòng)創(chuàng)建的書簽?!癖A艋蛐遁d工作流實(shí)例?!窠邮展ぷ髁鲗?shí)例生命周期事件通知。四順序容器Sequence與CodeActivitySequence:按順序執(zhí)行所包含的活動(dòng)類名:System.Activities.Statements.Sequence程序集:System.Activities(在System.Activities.dll中)語法:[ContentPropertyAttribute("Activities")]publicsealedclassSequence:NativeActivity屬性:Activities屬性:要按順序執(zhí)行的包含的活動(dòng)的集合。語法:publicCollection<Activity>Activities{get;}Variables屬性:包含的變量的集合。語法:publicCollection<Variable>Variables{get;}在WF中,任意從Activity派生的類都可以實(shí)例化運(yùn)行。而用VS2010自帶的模板所創(chuàng)建的流程是以System.Activities.Activity為根創(chuàng)建的,這時(shí),在設(shè)計(jì)器中只能向設(shè)計(jì)容器中添加一個(gè)活動(dòng),當(dāng)然流程在很多時(shí)候是具有多個(gè)節(jié)點(diǎn)的,為了解決這個(gè)問題,我們可以向設(shè)計(jì)器中的Activity根中添加一個(gè)順序容器Sequence,在順序容器Sequence中,可以添加多個(gè)活動(dòng),活動(dòng)在流程運(yùn)行時(shí)按其在順序容器Sequence中的上下順序依次執(zhí)行。WF4.0提供了很多內(nèi)置活動(dòng),但是這些活動(dòng)并不能完成具體的功能,這就需要我們定義自己的活動(dòng)。.NETFramework版本4提供了若干用于創(chuàng)建自定義活動(dòng)的選項(xiàng),用于創(chuàng)作給定活動(dòng)的正確方法取決于所需的運(yùn)行時(shí)功能?;净顒?dòng)類可用的功能Activity將一組系統(tǒng)提供的活動(dòng)和一組自定義活動(dòng)組成一個(gè)復(fù)合活動(dòng)。CodeActivity通過提供可以重寫的Execute方法實(shí)現(xiàn)命令性功能。還提供對(duì)跟蹤、變量以及參數(shù)的訪問NativeActivity提供CodeActivity的所有功能,另外還可中止活動(dòng)執(zhí)行、取消子活動(dòng)執(zhí)行、使用書簽以及計(jì)劃活動(dòng)、活動(dòng)操作和功能DynamicActivity提供一個(gè)類似于DOM的方法,使用該方法可以構(gòu)造通過IcustomTypeDescriptor與WF設(shè)計(jì)器和運(yùn)行時(shí)系統(tǒng)交互的活動(dòng),從而允許在不定義新類型的情況下創(chuàng)建新活動(dòng) ●使用Activity創(chuàng)作活動(dòng)從Activity派生的活動(dòng)通過組合其他現(xiàn)有活動(dòng)來構(gòu)成功能。這些活動(dòng)可以是現(xiàn)有的自定義活動(dòng),也可以是來自.NETFramework版本4活動(dòng)庫的活動(dòng)。組合這些活動(dòng)是創(chuàng)建自定義功能的最基本方法。使用可視化設(shè)計(jì)環(huán)境創(chuàng)作工作流時(shí)這種方法最常用。 ●使用CodeActivity創(chuàng)作活動(dòng)從CodeActivity派生的活動(dòng)可以通過用自定義的命令性代碼重寫Execute方法來實(shí)現(xiàn)命令性功能?;顒?dòng)由運(yùn)行時(shí)執(zhí)行時(shí)將執(zhí)行該自定義代碼。盡管使用這種方法創(chuàng)建的活動(dòng)可以訪問自定義功能,但是它們無法訪問運(yùn)行時(shí)的所有功能,如對(duì)執(zhí)行環(huán)境的完全訪問或?qū)ancel或Abort方法的支持。執(zhí)行CodeActivity時(shí),它可以訪問簡化版本的執(zhí)行環(huán)境(通過CodeActivityContext類)。使用CodeActivity創(chuàng)建的活動(dòng)可以訪問參數(shù)和變量解析、擴(kuò)展以及跟蹤。可以使用AsyncCodeActivity進(jìn)行異步活動(dòng)計(jì)劃。 ●使用NativeActivity創(chuàng)作活動(dòng)從NativeActivity派生的活動(dòng),與從CodeActivity派生的活動(dòng)一樣,可通過重寫Execute來創(chuàng)建命令性功能,除此之外還可以通過傳遞給Execute方法的NativeActivityContext訪問工作流運(yùn)行時(shí)的所有功能。此上下文支持安排和取消子活動(dòng)、執(zhí)行ActivityAction和ActivityFunc對(duì)象、取消和中止執(zhí)行、訪問執(zhí)行屬性和擴(kuò)展以及書簽(用于繼續(xù)已暫停工作流的句柄)。 ●使用DynamicActivity創(chuàng)作活動(dòng)與其他三種活動(dòng)類型不同,不會(huì)通過從DynamicActivity(該類是密封的)派生新類型來創(chuàng)建新功能,而是通過使用活動(dòng)文檔對(duì)象模型(DOM)將功能組合到Properties和Implementation屬性中。 ●創(chuàng)作返回結(jié)果的活動(dòng)很多活動(dòng)必須在其執(zhí)行之后返回結(jié)果。盡管可以在活動(dòng)上始終定義一個(gè)自定義OutArgument來實(shí)現(xiàn)此目的,但是建議改用Activity或者從CodeActivity或NativeActivity派生。這些基類中的每個(gè)類都具有一個(gè)名為Result的OutArgument,您的活動(dòng)可以使用它作為其返回值。CodeActivity:一種抽象類,用于創(chuàng)建具有強(qiáng)制行為(該行為是使用Execute(CodeActivityContext)方法定義的,利用該方法可以訪問變量以及參數(shù)解析和擴(kuò)展)的自定義活動(dòng)。類名:System.Activities.CodeActivity程序集:System.Activities(在System.Activities.dll中)功能說明:一個(gè)抽象類,繼承該類后,需要override該類的Execute方法,用于編寫自定義的功能代碼。在WF中,變量表示數(shù)據(jù)的存儲(chǔ)區(qū),參數(shù)表示流入和流出活動(dòng)的數(shù)據(jù)。活動(dòng)擁有一組參數(shù),這些參數(shù)構(gòu)成活動(dòng)的簽名。此外,活動(dòng)可以維護(hù)一個(gè)變量列表,在工作流設(shè)計(jì)期間,開發(fā)人員可在該列表中添加或移除變量。使用可返回值的表達(dá)式可以綁定參數(shù)。五數(shù)據(jù)的傳遞(Variable變量)變量是數(shù)據(jù)的存儲(chǔ)位置。變量被聲明為工作流定義的一部分。變量在運(yùn)行時(shí)獲取值,并將這些值存儲(chǔ)為工作流實(shí)例狀態(tài)的一部分。變量定義指定了變量的類型,如果需要,還可指定變量的名稱。Variable:可以從中派生工作流數(shù)據(jù)成員支持類Variable<T>的抽象基類。類名:System.Activities.Variable程序集:System.Activities(在System.Activities.dll中)語法:publicabstractclassVariable:LocationReference屬性:Name屬性:獲取或設(shè)置Variable的名稱。語法:publicstringName{get;set;}Modifiers屬性:獲取或設(shè)置此Variable的VariableModifiers值。 語法:publicVariableModifiersModifiers{get;set;}代碼創(chuàng)建Variable示例:Variable<string>var=newVariable<string>{Default="HelloWorld.",Modifiers=VariableModifiers.ReadOnly};注意:只有具備Variables屬性的Activity才可以定義變量。定義了變量的活動(dòng)的內(nèi)部活動(dòng)是可以訪問該變量的,它的外部活動(dòng)不能訪問該變量。變量的作用域:變量在運(yùn)行時(shí)的生存期與聲明該變量的活動(dòng)的生存期相同?;顒?dòng)完成后,其變量將被清除,并且無法再引用。Assign:為工作流級(jí)的變量賦值。類名:System.Activities.Statements.Assign程序集:System.Activities(在System.Activities.dll中)語法:publicsealedclassAssign:CodeActivity屬性:To屬性:指定活動(dòng)將為其分配活動(dòng)的Value值的Argument。 語法:[RequiredArgumentAttribute] publicOutArgumentTo{get;set;}Value屬性:指定分配的值。 語法:[RequiredArgumentAttribute]publicInArgumentValue{get;set;}六數(shù)據(jù)的傳遞(Arguments參數(shù))活動(dòng)作者使用參數(shù)來定義數(shù)據(jù)流入流出活動(dòng)的方式。在同一個(gè)流程內(nèi),所有活動(dòng)共享一組參數(shù)。每個(gè)參數(shù)都有特定的方向:In、Out、或InOut。工作流運(yùn)行時(shí)對(duì)數(shù)據(jù)流入流出活動(dòng)的時(shí)間有以下保證:●活動(dòng)開始執(zhí)行時(shí),將計(jì)算其所有輸入和輸入/輸出參數(shù)的值。例如,不管何時(shí)調(diào)用Get,返回值都為調(diào)用Execute之前運(yùn)行時(shí)所計(jì)算的值?!裾{(diào)用Set時(shí),運(yùn)行時(shí)將立即設(shè)置值?!窨筛鶕?jù)需要指定參數(shù)的EvaluationOrder。EvaluationOrder是一個(gè)從零開始的值,用于指定參數(shù)的計(jì)算順序。默認(rèn)情況下,參數(shù)的計(jì)算順序未指定且等于UnspecifiedEvaluationOrder值。將EvaluationOrder設(shè)置為一個(gè)大于或等于零的值,以便為此參數(shù)指定一個(gè)計(jì)算順序。WF以指定的計(jì)算順序按升序計(jì)算參數(shù)。請(qǐng)注意,未指定計(jì)算順序的參數(shù)將先于指定計(jì)算順序的參數(shù)計(jì)算?;顒?dòng)作者可使用強(qiáng)類型機(jī)制來公開該活動(dòng)的參數(shù)。實(shí)現(xiàn)方法是聲明InArgument、OutArgument和InOutArgument類型的屬性。這允許活動(dòng)作者建立有關(guān)流入流出活動(dòng)的數(shù)據(jù)的特定協(xié)定。InArument<T>:表示數(shù)據(jù)流入活動(dòng)的綁定終端。類名:System.Activities.InArgument<T>程序集:System.Activities(在System.Activities.dll中)語法:[ContentPropertyAttribute("Expression”)] [TypeConverterAttribute(typeof(InArgumentConverter))]publicsealedclassInArgument<T>:InArgument 使用說明:可以用VS設(shè)計(jì)器在xaml中定義In參數(shù)在xaml中定義的In參數(shù),可以在該xaml中被其他Activity用表達(dá)式綁定可以用code方式在codeActivity中定義In參數(shù)可以在屬性框中,將codeActivity中定義的In參數(shù)綁定到參數(shù)或變量,可以用表達(dá)式方式賦值運(yùn)行時(shí),可以用啟動(dòng)參數(shù)的方式對(duì)In參數(shù)賦值(xaml和code方式一樣)In參數(shù)不能在實(shí)例的OnCompleted事件中用WorkflowApplicationCompletedEventArgs.Outputs得到??梢允褂肁ssign為In參數(shù)賦值示例:在xaml形式的流程圖中使用In參數(shù)先在流程圖TestInXamlWorkflow.xaml文件中定義3個(gè)double型的In參數(shù)v1,v2,v3;啟動(dòng)時(shí)為v1,v2賦值在流程內(nèi)部用Assign為v3賦值v1+v2用WriteLine打印v3的值。下面是使用WorkflowApplication創(chuàng)建傳入?yún)?shù)的實(shí)例代碼:System.Collections.Generic.Dictionary<string,object>dic=newSystem.Collections.Generic.Dictionary<string,object>();dic.Add(“v1”,12.34);//前一個(gè)值是參數(shù)名,必須與實(shí)際參數(shù)名相同,后面是傳入值。dic.Add(“v2”,56.78);WorkflowApplicationmyIn=newWorkflowApplication(newTestInXamlWorkflow(),dic);myIn.Run();在自定義代碼活動(dòng)中使用In參數(shù)自定義活動(dòng)代碼如下:publicsealedclassTestInCodeActivity:CodeActivity{publicInArgument<string>Text{get;set;}protectedoverridevoidExecute(CodeActivityContextcontext){stringstr1=context.GetValue(this.Text);//得到Text參數(shù)值的第一種方式stringstr2=Text.Get(context);//得到Text參數(shù)值的第二種方式Console.WriteLine(str1);Console.WriteLine(str2);}}創(chuàng)建帶參數(shù)傳入的WorkflowApplication實(shí)例代碼如下:System.Collections.Generic.Dictionary<string,object>dic=newSystem.Collections.Generic.Dictionary<string,object>();dic.Add(“Text”,”Victor”);WorkflowApplicationmyIn=newWorkflowApplication(newTestInXamlWorkflow(),dic);myIn.Run();在Xaml形式的流程圖中使用帶參數(shù)的自定義活動(dòng),需要在流程圖中添加參數(shù)并與自定義活動(dòng)的參數(shù)綁定在一起。OutArument<T>:表示數(shù)據(jù)流出活動(dòng)的綁定終端。類名:System.Activities.OutArgument<T>程序集:System.Activities(在System.Activities.dll中)語法:[ContentPropertyAttribute("Expression”)] [TypeConverterAttribute(typeof(OutArgumentConverter))]publicsealedclassOutArgument<T>:OutArgument 使用說明:可以用VS設(shè)計(jì)器在xaml中定義Out參數(shù)在xaml中定義的Out參數(shù),可以在該xaml中被其他Activity用表達(dá)式綁定可以用code方式在codeActivity中定義Out參數(shù)可以在屬性框中,將codeActivity中定義的Out參數(shù)綁定到參數(shù)或變量,不能直接對(duì)Out參數(shù)賦值運(yùn)行時(shí),不能用啟動(dòng)參數(shù)的方式對(duì)Out參數(shù)賦值(xaml和code方式都不能)Out參數(shù)可以在實(shí)例的OnCompleted事件中用WorkflowApplicationCompletedEventArgs.Outputs得到??梢允褂肁ssign為Out參數(shù)賦值示例:在xaml形式的流程圖中使用Out參數(shù)先在流程圖TestOutXamlWorkflow.xaml文件中定義2個(gè)double型的In參數(shù)v1,v2,和定義一個(gè)double型的Out參數(shù)v3;啟動(dòng)時(shí)為v1,v2賦值在流程內(nèi)部用Assign為v3賦予v1+v2在completed中打印v3的值啟動(dòng)時(shí)賦值的代碼如下:System.Collections.Generic.Dictionary<string,object>dic=newSystem.Collections.Generic.Dictionary<string,object>();dic.Add(“v1”,12.34);dic.Add(“v2”,56.78);WorkflowApplicationmyOut=newWorkflowApplication(newTestOutXamlWorkflow(),dic);myOut.Completed=completed;myOut.Run();staticvoidcompleted(WorkflowApplicationCompletedEventArgse){Console.WriteLine(e.Outputs[“v3”].ToString());}在自定義代碼活動(dòng)中使用Out參數(shù)自定義活動(dòng)代碼如下:publicsealedclassTestOutCodeActivity:CodeActivity{publicOutArgument<string>Text{get;set;}protectedoverridevoidExecute(CodeActivityContextcontext){stringstr1=context.GetValue(this.Text);//得到Text參數(shù)值的第一種方式context.SetValue(Text,“ABC”+str1);//設(shè)置Text參數(shù)值的第一種方式stringstr2=Text.Get(context);//得到Text參數(shù)值的第二種方式Text.Set(context,“ABC”+str2);//設(shè)置Text參數(shù)值的第二種方式Console.WriteLine(Text.Get(context));}}創(chuàng)建WorkflowApplication實(shí)例啟動(dòng)流程,代碼如下:WorkflowApplicationmyOut=newWorkflowApplication(newTestOutXamlWorkflow());myOut.Run();在Xaml形式的流程圖中使用帶參數(shù)的自定義活動(dòng),需要在流程圖中添加參數(shù)或變量并與自定義活動(dòng)的參數(shù)綁定在一起。InOutArument<T>:表示數(shù)據(jù)流入和流出活動(dòng)的綁定終端。類名:System.Activities.InOutArgument<T>程序集:System.Activities(在System.Activities.dll中)語法:[ContentPropertyAttribute("Expression”)] [TypeConverterAttribute(typeof(InOutArgumentConverter))]publicsealedclassInOutArgument<T>:InOutArgument 使用說明:可以用VS設(shè)計(jì)器在xaml中定義In/Out參數(shù)在xaml中定義的In/Out參數(shù),可以在該xaml中被其他Activity用表達(dá)式綁定可以用code方式在codeActivity中定義In/Out參數(shù)可以在屬性框中,將codeActivity中定義的In/Out參數(shù)綁定到參數(shù)或變量,不能直接對(duì)In/Out參數(shù)賦值運(yùn)行時(shí),可以用啟動(dòng)參數(shù)的方式對(duì)In/Out參數(shù)賦值(xaml和code方式都可以)In/Out參數(shù)可以在實(shí)例的OnCompleted事件中用WorkflowApplicationCompletedEventArgs.Outputs得到。可以使用Assign為In/Out參數(shù)賦值示例:在xaml形式的流程圖中使用In/Out參數(shù)先在流程圖TestInOutXamlWorkflow.xaml文件中定義3個(gè)string型的In/Out參數(shù)v1,v2,v3;啟動(dòng)時(shí)為v1,v2,v3賦值在流程內(nèi)部用Assign為v3賦予v1+v2+v3在completed中打印v3的值啟動(dòng)流程代碼:System.Collections.Generic.Dictionary<string,object>dic=newSystem.Collections.Generic.Dictionary<string,object>();dic.Add(“v1”,“AA”);dic.Add(“v2”,“BB”);dic.Add(“v3”,“CC”);WorkflowApplicationmyInOut=newWorkflowApplication(newTestInOutXamlWorkflow(),dic);myInOut.Completed=completed;myInOut.Run();staticvoidcompleted(WorkflowApplicationCompletedEventArgse){Console.WriteLine(e.Outputs[“v3”].ToString());}在自定義代碼活動(dòng)中使用In/Out參數(shù)自定義活動(dòng)代碼如下:publicsealedclassTestInOutCodeActivity:CodeActivity{publicInOutArgument<string>Text{get;set;}protectedoverridevoidExecute(CodeActivityContextcontext){stringstr=context.GetValue(this.Text);context.SetValue(Text,“你好:”+str);Console.WriteLine(context.GetValue(this.Text));}}啟動(dòng)代碼如下:System.Collections.Generic.Dictionary<string,object>dic=newSystem.Collections.Generic.Dictionary<string,object>();dic.Add(“Text”,”Victor”);WorkflowApplicationmyInOut=newWorkflowApplication(newTestInOutCodeActivity(),dic);myInOut.Run();在Xaml形式的流程圖中使用帶參數(shù)的自定義活動(dòng),需要在流程圖中添加參數(shù)或變量并與自定義活動(dòng)的參數(shù)綁定在一起。返回單個(gè)值的活動(dòng)可從Activity、NativeActivity或CodeActivity派生。這些活動(dòng)擁有定義完善的名為Result的OutArgument,它包含活動(dòng)的返回值。七數(shù)據(jù)的傳遞(變量與參數(shù)的使用)In參數(shù):與該參數(shù)關(guān)聯(lián)的變量值可傳入內(nèi)部;內(nèi)部修改參數(shù)時(shí),關(guān)聯(lián)的變量不會(huì)更改。示例:定義一個(gè)自定義活動(dòng),代碼如下:publicsealedclassTestInChangeCodeActivity:CodeActivity{publicInArgument<string>Text{get;set;}protectedoverridevoidExecute(CodeActivityContextcontext){stringstr1=context.GetValue(this.Text);//得到從外部變量傳入的值Console.WriteLine(“傳入值為:{0}”,str1);Context.SetValue(Text,”BB”);//修改參數(shù)的值stringstr2=context.GetValue(this.Text);Console.WriteLine(“內(nèi)部修改為:{0}”,str2);}}在xaml工作流中創(chuàng)建了一個(gè)變量,并賦值為“AA”,然后將上面自定義活動(dòng)的Text參數(shù)和變量綁定,最后打印出變量的值。結(jié)果如下:Out參數(shù):與該參數(shù)關(guān)聯(lián)的變量值無法傳入內(nèi)部;內(nèi)部修改參數(shù)時(shí),關(guān)聯(lián)的變量也會(huì)更改。示例:將上面[In參數(shù)]示例中自定義活動(dòng)中的參數(shù)類型修改為OutArgument<string>,其他的不變。結(jié)果如下:In/Out參數(shù):與該參數(shù)關(guān)聯(lián)的變量值可以傳入內(nèi)部;內(nèi)部修改參數(shù)時(shí),關(guān)聯(lián)的變量也會(huì)更改。示例:將上面[In參數(shù)]示例中自定義活動(dòng)中的參數(shù)類型修改為InOutArgument<string>,其他的不變。結(jié)果如下:八控制流ActivityIf:建立If-Then-Else條件的模型。類名:System.Activities.Statements.If程序集:System.Activities(在System.Activities.dll中) 語法:publicsealedclassIf:NativeActivity 屬性:Condition屬性:用于確定要執(zhí)行哪個(gè)子活動(dòng)的條件。Then活動(dòng)在條件解析為true的情況下執(zhí)行。Else活動(dòng)在條件解析為false的情況下執(zhí)行。語法:[RequiredArgumentAttribute]publicInArgument<bool>Condition{get;set;}Then屬性:要在活動(dòng)的Condition解析為true的情況下執(zhí)行的活動(dòng)。語法:publicActivityThen{get;set;}Else屬性:要在活動(dòng)的Condition解析為false的情況下執(zhí)行的活動(dòng)。語法:publicActivityElse{get;set;}Switch<T>:基于給定表達(dá)式(其類型在此對(duì)象的類別說明符中指定)的值,從要執(zhí)行的多個(gè)活動(dòng)中選擇一個(gè)活動(dòng)。類名:System.Activities.Statements.Switch<T>程序集:System.Activities(在System.Activities.dll中) 語法:[ContentPropertyAttribute("Cases”)]publicsealedclassSwitch<T>:NativeActivity 屬性:Expression屬性:獲取要與Cases()集合中的鍵進(jìn)行比較的對(duì)象。語法:[RequiredArgumentAttribute]publicInArgument<T>Expression{get;set;}Cases屬性:表示可能執(zhí)行路徑的字典。每個(gè)條目都包含一個(gè)鍵以及一個(gè)將在表達(dá)式結(jié)果與該鍵匹配時(shí)執(zhí)行的活動(dòng)。語法:publicIDictionary<T,Activity>Cases{get;}Default屬性:表示在Cases()集合中沒有條目鍵與Expression()屬性匹配的情況下執(zhí)行的活動(dòng)。語法:publicActivityDefault{get;set;}While:在條件的計(jì)算結(jié)果為true時(shí)執(zhí)行包含的工作流元素。類名:System.Activities.Statements.While程序集:System.Activities(在System.Activities.dll中) 語法:ContentPropertyAttribute("Body")]publicsealedclassWhile:NativeActivity 屬性:Condition屬性:要在While循環(huán)的每次迭代之前執(zhí)行的Activity<Tresult>。語法:publicActivity<bool>Condition{get;set;}Body屬性:要在While循環(huán)中執(zhí)行的Activity。語法:publicActivityBody{get;set;}Variables屬性:與While活動(dòng)關(guān)聯(lián)的Variable對(duì)象的集合。語法:publicCollection<Variable>Variables{get;}DoWhile:一個(gè)循環(huán)活動(dòng),該活動(dòng)將執(zhí)行包含的活動(dòng)至少一次,直至條件不再為true為止。類名:System.Activities.Statements.DoWhile程序集:System.Activities(在System.Activities.dll中) 語法:ContentPropertyAttribute("Body")]publicsealedclassDoWhile:NativeActivity 屬性:Condition屬性:在循環(huán)結(jié)尾進(jìn)行檢查以確定是否再次執(zhí)行循環(huán)的[T:System.Activities.Activity]。語法:publicActivity<bool>Condition{get;set;}Body屬性:要隨每次迭代一起執(zhí)行的子活動(dòng)。語法:publicActivityBody{get;set;}Variables屬性:與DoWhile活動(dòng)關(guān)聯(lián)的Variable對(duì)象的集合。語法:publicCollection<Variable>Variables{get;}ForEach<T>:為Values集合中提供的每個(gè)值執(zhí)行活動(dòng)操作一次。類名:System.Activities.Statements.ForEach<T>程序集:System.Activities(在System.Activities.dll中) 語法:ContentPropertyAttribute("Body")]publicsealedclassForEach<T>:NativeActivity 屬性:Body屬性:要為Values集合中的每一項(xiàng)執(zhí)行的ActivityAction。語法:publicActivityAction<T>Body{get;set;}Values屬性:活動(dòng)的輸入集合,用于執(zhí)行Body活動(dòng)操作。語法:[RequiredArgumentAttribute]publicInArgument<IEnumerable<T>>Values{get;set;}九控制流Activity(二)Parallel:一個(gè)以異步方式同時(shí)執(zhí)行所有子活動(dòng)的活動(dòng)。類名:System.Activities.Statements.Parallel程序集:System.Activities(在System.Activities.dll中) 語法:ContentPropertyAttribute("Branches")]publicsealedclassParallel:NativeActivity 屬性:CompletionCondition屬性:在任何分支完成后計(jì)算。語法:publicActivity<bool>CompletionCondition{get;set;}說明:如果此屬性的計(jì)算結(jié)果為true,則會(huì)取消Branches集合中其他安排的元素。如果未設(shè)置此屬性,則Branches集合中的所有Activity對(duì)象都將執(zhí)行,直至完成為止。Branches屬性:要并行執(zhí)行的子元素。語法:publicCollection<Activity>Branches{get;}Variables屬性:包含的變量的集合。語法:publicCollection<Variable>Variables{get;}說明:Parallel活動(dòng)的工作方式為:在啟動(dòng)時(shí)同時(shí)安排其Branches集合中的每個(gè)Activity。該活動(dòng)將在所有其Branches均完成或其CompletionCondition屬性的計(jì)算結(jié)果為true時(shí)完成。盡管所有Activity對(duì)象均異步運(yùn)行,但它們不會(huì)在單獨(dú)的線程上運(yùn)行,因此每個(gè)連續(xù)的活動(dòng)將只會(huì)在以前安排的活動(dòng)完成或進(jìn)入空閑狀態(tài)時(shí)執(zhí)行。如果此活動(dòng)沒有任何子活動(dòng)進(jìn)入空閑狀態(tài),則此活動(dòng)將采用與Sequence活動(dòng)相同的方式執(zhí)行。Parallel中可以定義變量Parallel會(huì)并行執(zhí)行Branches集合內(nèi)的所有Activity當(dāng)CompletionCondition屬性為true時(shí),并行容器完成,其他沒有執(zhí)行完成的分支就不再執(zhí)行了(包括執(zhí)行一半的分支)示例:基本使用1、在流程中添加[WriteLine]打印當(dāng)前時(shí)間2、添加[Parallel],并添加兩個(gè)分支第一個(gè)分支添加[Delay]延時(shí)10秒,添加[WriteLine]打印當(dāng)"A"第二個(gè)分支添加[Delay]延時(shí)15秒,添加[WriteLine]打印當(dāng)"B"3、在流程中添加[WriteLine]打印當(dāng)前時(shí)間預(yù)期:兩次的系統(tǒng)時(shí)間差為15秒表示為并行,兩次的系統(tǒng)時(shí)間差為25秒表示為串行結(jié)果:CompletionCondition使用1、在流程中添加bool型變量[myVariable],默認(rèn)值False2、添加[Parallel],并添加三個(gè)分支第一個(gè)分支:添加[WriteLine]打印當(dāng)"A1";添加[Delay]延時(shí)10秒;添加[WriteLine]打印當(dāng)"A2"第二個(gè)分支:添加[WriteLine]打印當(dāng)"B1";添加[Delay]延時(shí)15秒;添加[WriteLine]打印當(dāng)"B2";添加[Assign]為變量[myVariable]賦值True第三個(gè)分支:添加[WriteLine]打印當(dāng)"C1";添加[Delay]延時(shí)20秒;添加[WriteLine]打印當(dāng)"C2"預(yù)期:[Assign]為變量[myVariable]賦值True后,容器結(jié)束,因此會(huì)依次看到[A1,B1,C1,A2,B2],但看不到[C2]結(jié)果:Pick:提供基于事件的控制流建模。類名:System.Activities.Statements.Pick程序集:System.Activities(在System.Activities.dll中) 語法:ContentPropertyAttribute("Branches")]publicsealedclassPick:NativeActivity 屬性:Branches屬性:PickBranch對(duì)象的集合,Pick活動(dòng)可能會(huì)基于傳入的事件執(zhí)行其中的一個(gè)活動(dòng)。語法:publicCollection<PickBranch>Branches{get;}說明: 此活動(dòng)的行為與Switch的類似之處在于:它只執(zhí)行若干活動(dòng)中的一個(gè)活動(dòng)來響應(yīng)事件。選擇執(zhí)行的活動(dòng)由從一組事件中選擇的一個(gè)事件定義。PickBranch:Pick活動(dòng)內(nèi)的可能執(zhí)行路徑。類名:System.Activities.Statements.PickBranch程序集:System.Activities(在System.Activities.dll中) 語法:ContentPropertyAttribute("Action")]publicsealedclassPickBranch 屬性:Action屬性:要在已觸發(fā)執(zhí)行此分支的情況下執(zhí)行的Activity。語法:publicActivityAction{get;set;}DisplayName屬性:在活動(dòng)設(shè)計(jì)器中顯示的此分支的名稱。語法:publicstringDisplayName{get;set;}Trigger屬性:其完成激活此pick分支的活動(dòng)。語法:publicActivityTrigger{get;set;}Variables屬性:與此活動(dòng)關(guān)聯(lián)的用戶定義變量的集合。語法:publicCollection<Variable>Variables{get;}說明: PickBranch包含Trigger和Action。開始執(zhí)行Pick元素時(shí),會(huì)安排所有PickBranch元素中的所有觸發(fā)器活動(dòng)。在第一個(gè)活動(dòng)完成之后,安排其相應(yīng)的操作活動(dòng),并且取消所有其他觸發(fā)器活動(dòng)。Pick和PickBranch的一些說明:●Pick觸發(fā)容器,提供了基于事件的控制流。Branches集合是觸發(fā)容器的分支集合,只能添加PickBranch●Pick觸發(fā)容器中可以定義變量●PickBranch只可添加到Pick中,PickBranch.Trigger只能放入觸發(fā)類Activity;PickBranch.Action當(dāng)PickBranch.Trigger被觸發(fā)時(shí),所要執(zhí)行的●只要有一個(gè)PickBranch的Trigger被觸發(fā),其他PickBranch就不會(huì)被觸發(fā)了●即使在被執(zhí)行的PickBranch還沒完成時(shí),其他PickBranch也不會(huì)被觸發(fā)示例:基本使用1、在工作流中添加[WriteLine],打印系統(tǒng)時(shí)間2、在工作流中添加[Pick],添加三個(gè)[PickBranch]第一個(gè)分支:[Trigger]添加[Delay]延時(shí)15秒[Action]添加[WriteLine]打印當(dāng)"A"第二個(gè)分支:[Trigger]添加[Delay]延時(shí)10秒[Action]添加[WriteLine]打印當(dāng)"B1"添加[Delay]延時(shí)15秒添加[WriteLine]打印當(dāng)"B2"第三個(gè)分支:[Trigger]添加[Delay]延時(shí)20秒[Action]添加[WriteLine]打印當(dāng)"C"預(yù)期:只有第二個(gè)分支會(huì)被執(zhí)行結(jié)果:ParallelForEach<T>:枚舉集合元素并對(duì)集合中的每個(gè)元素并行執(zhí)行嵌入語句。類名:System.Activities.Statements.ParallelForEach<T>程序集:System.Activities(在System.Activities.dll中) 語法:ContentPropertyAttribute("Body")]publicsealedclassParallelForEach<T>:NativeActivity 屬性:CompletionCondition屬性:在每個(gè)迭代完成后計(jì)算。語法:publicActivity<bool>CompletionCondition{get;set;}說明:如果其計(jì)算結(jié)果為true,則取消已安排的掛起的迭代。如果未設(shè)置此屬性,則所有安排的語句都將執(zhí)行,直至完成為止。Body屬性:為Values集合中包含的每個(gè)值執(zhí)行一次的ActivityAction。語法:publicActivityAction<T>Body{get;set;}Values屬性:值的集合,用作Body中所包含活動(dòng)的每個(gè)迭代的參數(shù)。語法:[RequiredArgumentAttribute]publicInArgument<IEnumerable<T>>Values{get;set;}說明:嵌入的語句將一起安排并異步運(yùn)行,但它們不會(huì)在單獨(dú)的線程上運(yùn)行,因此每個(gè)連續(xù)的活動(dòng)將只會(huì)在以前安排的活動(dòng)完成或進(jìn)入空閑狀態(tài)時(shí)執(zhí)行。如果此活動(dòng)沒有任何子活動(dòng)進(jìn)入空閑狀態(tài),則此活動(dòng)將采用與ForEach<T>活動(dòng)相同的方式執(zhí)行。 示例: ①基本使用1、創(chuàng)建一codeactivity名為CollectionCodeActivity,具有Out參數(shù),類型為List<string>的參數(shù)myOutCollection2、在流程中添加List<string>變量myCollection3、在流程中添加CollectionCodeActivity,將CollectionCodeActivity.myOutCollection參數(shù)綁定到myCollection變量4、在流程中添加ForEach<T>,TypeArgument屬性指定string,Values屬性綁定到myCollection變量,在Body中添加WriteLine,打印item自定義活動(dòng)代碼如下:publicsealedclassCollectionCodeActivity:CodeActivity{publicOutArgument<List<string>>myOutCollection{get;set;}protectedoverridevoidExecute(CodeActivityContextcontext){List<string>list=newList<string>();list.Add(“A”);list.Add(“B”);list.Add(“C”);context.SetValue(this.myOutCollection,list);}}結(jié)果:十Collection集合操作AddToCollection<T>:向指定集合中添加項(xiàng)。類名:System.Activities.Statements.AddToCollection<T>程序集:System.Activities(在System.Activities.dll中) 語法:ContentPropertyAttribute("Collection")]publicsealedclassAddToCollection<T>:CodeActivity 屬性:Collection屬性:接收新項(xiàng)的集合。語法:[RequiredArgumentAttribute]publicInArgument<ICollection<T>>Collection{get;set;}Item屬性:要添加到指定集合中的項(xiàng)。語法:[RequiredArgumentAttribute]publicInArgument<T>Item{get;set;}RemoveFromCollection<T>:從指定集合中移除項(xiàng)。類名:System.Activities.Statements.RemoveFromCollection<T>程序集:System.Activities(在System.Activities.dll中) 語法:ContentPropertyAttribute("Collection")]publicsealedclassRemoveFromCollection<T>:CodeActivity<bool> 屬性:Collection屬性:要從中移除Item的集合。語法:[RequiredArgumentAttribute]publicInArgument<ICollection<T>>Collection{get;set;}Item屬性:要從指定的Collection中移除的項(xiàng)。語法:[RequiredArgumentAttribute]publicInArgument<T>Item{get;set;}Result屬性:表示操作結(jié)果,如果操作成功返回True,不成功返回False說明:如果集合中的有兩個(gè)相同的項(xiàng),只移除第一個(gè)。ClearCollection<T>:從指定集合中移除項(xiàng)。類名:System.Activities.Statements.ClearCollection<T>程序集:System.Activities(在System.Activities.dll中) 語法:ContentPropertyAttribute("Collection")]publicsealedclassClearCollection<T>:CodeActivity 屬性:Collection屬性:要清除其內(nèi)容的集合。語法:[RequiredArgumentAttribute]publicInArgument<ICollection<T>>Collection{get;set;}ExistsInCollection<T>:指示給定項(xiàng)是否存在于給定集合中。類名:System.Activities.Statements.ExistsInCollection<T>程序集:System.Activities(在System.Activities.dll中) 語法:ContentPropertyAttribute("Collection")]publicsealedclassExistsInCollection<T>:CodeActivity<bool> 屬性:Collection屬性:要進(jìn)行搜索以查找指定元素的集合。語法:[RequiredArgumentAttribute]publicInArgument<ICollection<T>>Collection{get;set;}Item屬性:要在指定集合中搜索的項(xiàng)。語法:[RequiredArgumentAttribute]publicInArgument<T>Item{get;set;}Result屬性:表示查找結(jié)果,如果存在成功返回True,不存在返回False十一Exception異常與TerminateWorkflow結(jié)束異常WF為在工作流中處理運(yùn)行時(shí)錯(cuò)誤條件提供了多個(gè)不同機(jī)制。工作流可以結(jié)合使用異常處理程序、事務(wù)以及補(bǔ)償來妥善處理錯(cuò)誤條件并從中恢復(fù)。工作流可以使用TryCatch活動(dòng)處理工作流執(zhí)行期間引發(fā)的異常??梢詫?duì)這些異常進(jìn)行處理,或者使用Rethrow活動(dòng)重新引發(fā)異常。Finally節(jié)中的活動(dòng)在Try節(jié)或Catches節(jié)完成時(shí)執(zhí)行。工作流還可以使用WorkflowInstance的OnUnhandledException事件處理程序處理未由TryCatch活動(dòng)處理的異常。異常的原因:在工作流中,異常可能通過下列方式生成:●TransactionScopeActivity中的事務(wù)超時(shí)。●工作流通過使用Throw活動(dòng)引發(fā)的顯式異常。●某個(gè)活動(dòng)引發(fā)的.NETFramework4異常。●外部代碼引發(fā)的異常,例如工作流中使用的庫、組件或服務(wù)。WF流程結(jié)束方式:WF實(shí)例如果在運(yùn)行過程中沒有出現(xiàn)問題,ActivityInstanceState(實(shí)例狀態(tài))會(huì)由Executing(執(zhí)行中)變?yōu)镃losed(關(guān)閉)。如果流程被調(diào)用Terminate方法遇到TerminateWorkflow活動(dòng)產(chǎn)生異常時(shí)沒有用WorkflowApplication.OnUnhandledException產(chǎn)生異常時(shí)指定UnhandledExceptionAction.TerminateActivityInstanceState(實(shí)例狀態(tài))會(huì)由Executing(執(zhí)行中)變?yōu)閒aulted(有問題)。如果流程被調(diào)用Canceled方法產(chǎn)生異常時(shí)指定UnhandledExceptionAction.CanceledActivityInstanceState(實(shí)例狀態(tài))會(huì)由Executing(執(zhí)行中)變?yōu)镃anceled(取消)。如果流程被調(diào)用Aborted方法產(chǎn)生異常時(shí)指定UnhandledExceptionAction.Aborted流程會(huì)運(yùn)行失敗,并觸出發(fā)實(shí)例的Aborted運(yùn)行失敗的流程無ActivityInstanceState(實(shí)例狀態(tài))。ActivityInstanceState(實(shí)例狀態(tài))的Closed(關(guān)閉),faulted(有問題),Canceled(取消)都表示流程結(jié)束,并觸出發(fā)實(shí)例的Completed。流程Aborted(中止),流程會(huì)即時(shí)消失,觸出發(fā)實(shí)例的Aborted,不會(huì)觸出發(fā)實(shí)例的Completed。WorkflowApplication的幾個(gè)屬性:●Aborted屬性:獲取或設(shè)置中止工作流實(shí)例時(shí)調(diào)用的Action<T>。語法:publicAction<WorkflowApplicationAbortedEventArgs>Aborted{get;set;}屬性值類型:SystemAction<WorkflowApplicationAbortedEventArgs>終止工作流實(shí)例時(shí)調(diào)用的操作?!馛ompleted屬性:獲取或設(shè)置工作流實(shí)例完成時(shí)調(diào)用的Action<T>。語法:publicAction<WorkflowApplicationCompletedEventArgs>Completed{get;set;}屬性值類型:SystemAction<WorkflowApplicationCompletedEventArgs>工作流實(shí)例完成時(shí)調(diào)用的操作?!馡del屬性:獲取或設(shè)置當(dāng)前工作流實(shí)例進(jìn)入空閑狀態(tài)時(shí)調(diào)用的Action<>。語法:publicAction<WorkflowApplicationIdleEventArgs>Idle{get;set;}屬性值類型:SystemAction<WorkflowApplicationIdleEventArgs>工作流實(shí)例進(jìn)入空閑狀態(tài)時(shí)執(zhí)行的操作?!馩nUnhandledException屬性:獲取或設(shè)置當(dāng)前工作流實(shí)例遇到未處理的異常時(shí)調(diào)用的Func<T,Tresult>。語法:publicFunc<WorkflowApplicationUnhandledExceptionEventArgs,UnhandledExceptionAction>OnUnhandledException{get;set;}屬性值類型:SystemFunc<WorkflowApplicationUnhandledExceptionEventArgs,UnhandledExceptionAction>工作流實(shí)例遇到未處理的異常時(shí)調(diào)用的委托?!馪ersistableIdle屬性:獲取或設(shè)置當(dāng)前工作流實(shí)例處于空閑狀態(tài)并可被保留時(shí)調(diào)用的ActivityFunc。語法:publicFunc<WorkflowApplicationIdleEventArgs,PersistableIdleAction>PersistableIdle{get;set;}屬性值類型:SystemFunc<WorkflowApplicationIdleEventArgs,PersistableIdleAction>當(dāng)前工作流實(shí)例處于空閑狀態(tài)并可被保留時(shí)調(diào)用的ActivityFunc?!馯nloaded屬性:獲取或設(shè)置卸載當(dāng)前工作流時(shí)調(diào)用的Action<T>。語法:publicAction<WorkflowApplicationEventArgs>Unloaded{get;set;}屬性值類型:SystemAction<WorkflowApplicationEventArgs>卸載工作流實(shí)例時(shí)調(diào)用的操作。使用WorkflowApplication.OnUnhandledException處理Code異常如果異常由某個(gè)活動(dòng)引發(fā)并且未經(jīng)處理,則默認(rèn)行為是終止該工作流實(shí)例。如果存在自定義OnUnhandledException處理程序,則它會(huì)重寫此默認(rèn)行為。通過此處理程序,工作流宿主作者能夠提供合適的處理操作,例如自定義日志記錄、中止工作流、取消工作流或終止工作流。示例:處理Code異常,下面是產(chǎn)生Code異常的Activity的代碼:publicsealedclassTestCodeExceptionActivity:CodeActivity{protectedoverridevoidExecute(CodeActivityContextcontext){intv=1–1;doublei=1/v;}}工作流完成時(shí)調(diào)用的Action代碼如下:staticvoidworkflowCompleted(WorkflowApplicationCompletedEventArgse){Console.WriteLine("工作流順利完成,實(shí)例編號(hào):{0},狀態(tài):{1}",e.InstanceId,e.CompletionState.ToString());}工作流中止時(shí)調(diào)用的Action代碼如下:staticvoidworkflowAborted(WorkflowApplicationAbortedEventArgse){Console.WriteLine("工作流被中止,實(shí)例編號(hào):{0},Reason:{1}",e.InstanceId,e.Reason.Message);}工作流遇到未處理的異常時(shí)返回UnhandledExceptionAction.Abort代碼如下:staticUnhandledExceptionActionunhandledException_Abort(WorkflowApplicationUnhandledExceptionEventArgse){Console.WriteLine("遇到未處理的異常_Abort:{0}",e.UnhandledException.Message);returnUnhandledExceptionAction.Abort;}工作流遇到未處理的異常時(shí)返回UnhandledExceptionAction.Terminate代碼如下:staticUnhandledExceptionActionunhandledException_Terminate(WorkflowApplicationUnhandledExceptionEventArgse){Console.WriteLine("遇到未處理的異常_Terminate:{0}",e.UnhandledException.Message);returnUnhandledExceptionAction.Terminate;}不使用UnhandledExceptionAction方式staticvoidExceptionWithoutUnhandledException_None(){WorkflowApplicationmyInstance=newWorkflowApplication(newTestExceptionWithoutUnhandledExceptionWorkflow());myInstance.Completed=newAction<WorkflowApplicationCompletedEventArgs>(workflowCompleted);myInstance.Aborted=newAction<WorkflowApplicationAbortedEventArgs>(workflowAborted);myInstance.Run();}結(jié)果:使用UnhandledExceptionAction.Abort方式staticvoidExceptionWithUnhandledException_Abort(){WorkflowApplicationmyInstance=newWorkflowApplication(newTestExceptionWithUnhandledExceptionWorkflow());myInstance.Completed=newAction<WorkflowApplicationCompletedEventArgs>(workflowCompleted);myInstance.Aborted=newAction<WorkflowApplicationAbortedEventArgs>(workflowAborted);myInstance.OnUnhandledException=newFunc<WorkflowApplicationUnhandledExceptionEventArgs,UnhandledExceptionAction>(unhandledException_Abort);myInstance.Run();}結(jié)果:使用UnhandledExceptionAction.Terminate方式staticvoidExceptionWithUnhandledException_Terminate(){WorkflowApplicationmyInstance=newWorkflowApplication(newTestExceptionWithUnhandledExceptionWorkflow());myInstance.Completed=newAction<WorkflowApplicationCompletedEventArgs>(workflowCompleted);myInstance.Aborted=newAction<WorkflowApplicationAbortedEventArgs>(workflowAborted);myInstance.OnUnhandledException=newFunc<WorkflowApplicationUnhandledExceptionEventArgs,UnhandledExceptionAction>(unhandledException_Terminate);myInstance.Run();}結(jié)果:使用UnhandledExceptionAction.Cancel方式如果異常出現(xiàn)在Cancellation
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 大使館防詐騙知識(shí)培訓(xùn)內(nèi)容課件
- 橋梁工程信息化管理方案
- 公司緊固件鐓鍛工綜合考核試卷及答案
- 公司膠基糖制造工數(shù)字化系統(tǒng)操作考核試卷及答案
- 公司配料熔制工職業(yè)技能考核試卷及答案
- 戶型產(chǎn)品基礎(chǔ)知識(shí)培訓(xùn)
- 乙烯生產(chǎn)線項(xiàng)目建設(shè)工程方案
- 建筑項(xiàng)目工程費(fèi)用審核方案
- 項(xiàng)目進(jìn)度延誤補(bǔ)救措施方案
- 建筑綜合維修保養(yǎng)方案
- 2025年屠檢考務(wù)試卷及答案
- 五金材料知識(shí)培訓(xùn)課件
- 2025年學(xué)校少先隊(duì)知識(shí)應(yīng)知應(yīng)會(huì)題庫(含答案)
- 2026中國農(nóng)業(yè)銀行秋季校園招聘備考考試題庫附答案解析
- 校園科技教育主題班會(huì)活動(dòng)方案
- 中海油勞動(dòng)合同范本(標(biāo)準(zhǔn)版)
- 施工機(jī)械設(shè)備情況及進(jìn)場計(jì)劃
- 關(guān)注兒童保護(hù)眼睛健康科普知識(shí)PPT
- 紅十字會(huì)救護(hù)員培訓(xùn)理論試題附答案
- SF∕T 0097-2021 醫(yī)療損害司法鑒定指南
- T∕CCCMHPIE 1.2-2016 植物提取物 檳榔多糖多酚
評(píng)論
0/150
提交評(píng)論