




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
WF4.0基礎篇學習筆記WF4.0基礎篇學習筆記一開始使用WF創建一個新的“工作流控制臺應用程序”包含兩部分:用于描述流程結構的一個XAML文件調用流程的宿主程序XAML流程結構描述文件<Activity……x:Class=”WorkflowConsoleApplication1.Workflow1”……><WriteLine……Text=”HelloWorld!”/></Activity>WF4.0的流程是由一組活動組成的,當流程運行時,流程內的活動按一定的順序依次執行。其中<Activity></Activity>是這個流程的根活動。<WriteLine/>是WF4.0的一個內置活動,其功能就是在屏幕打印Text屬性的內容。x:Class=”WorkflowConsoleApplication1.Workflow1”則是將XAML文件編譯成.NET類時所對應的類名。宿主程序WorkflowInvoker.Invoke(newWorkflow1());其中,WorkflowInvoker是一個用于調用工作流的功能類,可以使用該類的Invoke靜態方法調用流程。Invoke(newWorkflow1())所使用的類就是XAML文件中x:Class=”WorkflowConsoleApplication1.Workflow1”所定義的類名。二Activity介紹及WriteLineActivity的使用活動(Activity):工作流中的內容是一個活動,包括工作流本身。工作流是特殊類型的活動,它一般允許在其中定義其他活動,這稱為復合活動。活動是一個最終派生自Activity抽象類的類。類層次結構比Worknow3.x的定義更深,主要類如下圖所示:Activity類是所有工作流活動的根,一般從第二層派生自定義活動。要創建一個簡單的活動,如上面提到的WriteLine活動,應從CodeActivity中派生,因為這個類有足夠的功能可以輸出數據行。執行并返回某種形式的結果的活動應派生自ActivityWithResult類——注意這里最好使用泛型類Activity<TResult>,因為它提供了一個強類型化的Result屬性。為了讓活動執行某個操作,一般應重寫Execute()方法,它根據所選擇的基類有許多不同的簽名,這些簽名如下表所示?;怑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()方法的參數不同,因為它使用了特定于類型的執行上下文參數。在Workflow3.x中,只使用了一個ActivityExecutionContext類,而在Workflow4中,可以為不同類別的活動使用不同的上下文。主要區別是,與NativeActivityContext相比,CodeActivityContext與派生的AsyncCodeActivityContext的功能有限。這說明,派生自CodeActivity和AsyncCodeActivity的活動可以執行的操作遠遠少于它們的容器。例如,前面提到的WriteLine活動只需寫入控制臺,因此,它不需要訪問其運行庫環境。更復雜的活動需要調度其他子活動,或與其他系統通信,此時就需要從NativeActivity中派生,以訪問完整的運行庫。WF提供了許多標準活動,下面幾節將介紹其中一些活動的示例和使用這些活動的場合。Workflow4使用3個主要的程序集:System.Activities.dll、System.Activities.Core.Presentation.dll和System.Activities.Presentation.dllWriteLine:將指定的字符串寫入指定TextWriter對象。類名: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;}三流程實例WorkflowApplication與設計WF程序的基本原則WorkflowInvoker類是Workflow4.0新增的,它允許同步調用工作流,WorkflowInvoker類的同步功能非常適用于運行短時間的工作流,以響應某些UI動作——可以使用工作流啟用或禁用UI的某些元素。盡管WorkflowInvoker類對于同步執行工作流很有用,但我們可能需要長時間運行的工作流,它們可以持久化到數據庫中,在將來的某個時刻需要提取出來。此時應使用WorkflowApplication類。WorkflowApplication類為單個工作流實例提供宿主。它是由工作流運行時管理的實際工作流實例的代理。WorkflowApplication的用戶可以通過調用WorkflowApplication對象中的適當方法,指示工作流運行時在工作流實例上執行操作。如果請求的操作無效,則引發異常。使用WorkflowApplication,可以執行以下任務:●創建新的工作流實例,或從實例存儲區中加載工作流實例?!裉峁U展以供工作流實例內的活動使用?!窨刂乒ぷ髁鲗嵗膱绦??!窕謴陀晒ぷ髁鲗嵗齼鹊幕顒觿摻ǖ臅灐!癖A艋蛐遁d工作流實例?!窠邮展ぷ髁鲗嵗芷谑录ㄖ?。四順序容器Sequence與CodeActivitySequence:按順序執行所包含的活動類名:System.Activities.Statements.Sequence程序集:System.Activities(在System.Activities.dll中)語法:[ContentPropertyAttribute("Activities")]publicsealedclassSequence:NativeActivity屬性:Activities屬性:要按順序執行的包含的活動的集合。語法:publicCollection<Activity>Activities{get;}Variables屬性:包含的變量的集合。語法:publicCollection<Variable>Variables{get;}在WF中,任意從Activity派生的類都可以實例化運行。而用VS2010自帶的模板所創建的流程是以System.Activities.Activity為根創建的,這時,在設計器中只能向設計容器中添加一個活動,當然流程在很多時候是具有多個節點的,為了解決這個問題,我們可以向設計器中的Activity根中添加一個順序容器Sequence,在順序容器Sequence中,可以添加多個活動,活動在流程運行時按其在順序容器Sequence中的上下順序依次執行。WF4.0提供了很多內置活動,但是這些活動并不能完成具體的功能,這就需要我們定義自己的活動。.NETFramework版本4提供了若干用于創建自定義活動的選項,用于創作給定活動的正確方法取決于所需的運行時功能?;净顒宇惪捎玫墓δ蹵ctivity將一組系統提供的活動和一組自定義活動組成一個復合活動。CodeActivity通過提供可以重寫的Execute方法實現命令性功能。還提供對跟蹤、變量以及參數的訪問NativeActivity提供CodeActivity的所有功能,另外還可中止活動執行、取消子活動執行、使用書簽以及計劃活動、活動操作和功能DynamicActivity提供一個類似于DOM的方法,使用該方法可以構造通過IcustomTypeDescriptor與WF設計器和運行時系統交互的活動,從而允許在不定義新類型的情況下創建新活動 ●使用Activity創作活動從Activity派生的活動通過組合其他現有活動來構成功能。這些活動可以是現有的自定義活動,也可以是來自.NETFramework版本4活動庫的活動。組合這些活動是創建自定義功能的最基本方法。使用可視化設計環境創作工作流時這種方法最常用。 ●使用CodeActivity創作活動從CodeActivity派生的活動可以通過用自定義的命令性代碼重寫Execute方法來實現命令性功能。活動由運行時執行時將執行該自定義代碼。盡管使用這種方法創建的活動可以訪問自定義功能,但是它們無法訪問運行時的所有功能,如對執行環境的完全訪問或對Cancel或Abort方法的支持。執行CodeActivity時,它可以訪問簡化版本的執行環境(通過CodeActivityContext類)。使用CodeActivity創建的活動可以訪問參數和變量解析、擴展以及跟蹤??梢允褂肁syncCodeActivity進行異步活動計劃。 ●使用NativeActivity創作活動從NativeActivity派生的活動,與從CodeActivity派生的活動一樣,可通過重寫Execute來創建命令性功能,除此之外還可以通過傳遞給Execute方法的NativeActivityContext訪問工作流運行時的所有功能。此上下文支持安排和取消子活動、執行ActivityAction和ActivityFunc對象、取消和中止執行、訪問執行屬性和擴展以及書簽(用于繼續已暫停工作流的句柄)。 ●使用DynamicActivity創作活動與其他三種活動類型不同,不會通過從DynamicActivity(該類是密封的)派生新類型來創建新功能,而是通過使用活動文檔對象模型(DOM)將功能組合到Properties和Implementation屬性中。 ●創作返回結果的活動很多活動必須在其執行之后返回結果。盡管可以在活動上始終定義一個自定義OutArgument來實現此目的,但是建議改用Activity或者從CodeActivity或NativeActivity派生。這些基類中的每個類都具有一個名為Result的OutArgument,您的活動可以使用它作為其返回值。CodeActivity:一種抽象類,用于創建具有強制行為(該行為是使用Execute(CodeActivityContext)方法定義的,利用該方法可以訪問變量以及參數解析和擴展)的自定義活動。類名:System.Activities.CodeActivity程序集:System.Activities(在System.Activities.dll中)功能說明:一個抽象類,繼承該類后,需要override該類的Execute方法,用于編寫自定義的功能代碼。在WF中,變量表示數據的存儲區,參數表示流入和流出活動的數據。活動擁有一組參數,這些參數構成活動的簽名。此外,活動可以維護一個變量列表,在工作流設計期間,開發人員可在該列表中添加或移除變量。使用可返回值的表達式可以綁定參數。五數據的傳遞(Variable變量)變量是數據的存儲位置。變量被聲明為工作流定義的一部分。變量在運行時獲取值,并將這些值存儲為工作流實例狀態的一部分。變量定義指定了變量的類型,如果需要,還可指定變量的名稱。Variable:可以從中派生工作流數據成員支持類Variable<T>的抽象基類。類名:System.Activities.Variable程序集:System.Activities(在System.Activities.dll中)語法:publicabstractclassVariable:LocationReference屬性:Name屬性:獲取或設置Variable的名稱。語法:publicstringName{get;set;}Modifiers屬性:獲取或設置此Variable的VariableModifiers值。 語法:publicVariableModifiersModifiers{get;set;}代碼創建Variable示例:Variable<string>var=newVariable<string>{Default="HelloWorld.",Modifiers=VariableModifiers.ReadOnly};注意:只有具備Variables屬性的Activity才可以定義變量。定義了變量的活動的內部活動是可以訪問該變量的,它的外部活動不能訪問該變量。變量的作用域:變量在運行時的生存期與聲明該變量的活動的生存期相同。活動完成后,其變量將被清除,并且無法再引用。Assign:為工作流級的變量賦值。類名:System.Activities.Statements.Assign程序集:System.Activities(在System.Activities.dll中)語法:publicsealedclassAssign:CodeActivity屬性:To屬性:指定活動將為其分配活動的Value值的Argument。 語法:[RequiredArgumentAttribute] publicOutArgumentTo{get;set;}Value屬性:指定分配的值。 語法:[RequiredArgumentAttribute]publicInArgumentValue{get;set;}六數據的傳遞(Arguments參數)活動作者使用參數來定義數據流入流出活動的方式。在同一個流程內,所有活動共享一組參數。每個參數都有特定的方向:In、Out、或InOut。工作流運行時對數據流入流出活動的時間有以下保證:●活動開始執行時,將計算其所有輸入和輸入/輸出參數的值。例如,不管何時調用Get,返回值都為調用Execute之前運行時所計算的值。●調用Set時,運行時將立即設置值。●可根據需要指定參數的EvaluationOrder。EvaluationOrder是一個從零開始的值,用于指定參數的計算順序。默認情況下,參數的計算順序未指定且等于UnspecifiedEvaluationOrder值。將EvaluationOrder設置為一個大于或等于零的值,以便為此參數指定一個計算順序。WF以指定的計算順序按升序計算參數。請注意,未指定計算順序的參數將先于指定計算順序的參數計算?;顒幼髡呖墒褂脧婎愋蜋C制來公開該活動的參數。實現方法是聲明InArgument、OutArgument和InOutArgument類型的屬性。這允許活動作者建立有關流入流出活動的數據的特定協定。InArument<T>:表示數據流入活動的綁定終端。類名:System.Activities.InArgument<T>程序集:System.Activities(在System.Activities.dll中)語法:[ContentPropertyAttribute("Expression”)] [TypeConverterAttribute(typeof(InArgumentConverter))]publicsealedclassInArgument<T>:InArgument 使用說明:可以用VS設計器在xaml中定義In參數在xaml中定義的In參數,可以在該xaml中被其他Activity用表達式綁定可以用code方式在codeActivity中定義In參數可以在屬性框中,將codeActivity中定義的In參數綁定到參數或變量,可以用表達式方式賦值運行時,可以用啟動參數的方式對In參數賦值(xaml和code方式一樣)In參數不能在實例的OnCompleted事件中用WorkflowApplicationCompletedEventArgs.Outputs得到。可以使用Assign為In參數賦值示例:在xaml形式的流程圖中使用In參數先在流程圖TestInXamlWorkflow.xaml文件中定義3個double型的In參數v1,v2,v3;啟動時為v1,v2賦值在流程內部用Assign為v3賦值v1+v2用WriteLine打印v3的值。下面是使用WorkflowApplication創建傳入參數的實例代碼:System.Collections.Generic.Dictionary<string,object>dic=newSystem.Collections.Generic.Dictionary<string,object>();dic.Add(“v1”,12.34);//前一個值是參數名,必須與實際參數名相同,后面是傳入值。dic.Add(“v2”,56.78);WorkflowApplicationmyIn=newWorkflowApplication(newTestInXamlWorkflow(),dic);myIn.Run();在自定義代碼活動中使用In參數自定義活動代碼如下:publicsealedclassTestInCodeActivity:CodeActivity{publicInArgument<string>Text{get;set;}protectedoverridevoidExecute(CodeActivityContextcontext){stringstr1=context.GetValue(this.Text);//得到Text參數值的第一種方式stringstr2=Text.Get(context);//得到Text參數值的第二種方式Console.WriteLine(str1);Console.WriteLine(str2);}}創建帶參數傳入的WorkflowApplication實例代碼如下:System.Collections.Generic.Dictionary<string,object>dic=newSystem.Collections.Generic.Dictionary<string,object>();dic.Add(“Text”,”Victor”);WorkflowApplicationmyIn=newWorkflowApplication(newTestInXamlWorkflow(),dic);myIn.Run();在Xaml形式的流程圖中使用帶參數的自定義活動,需要在流程圖中添加參數并與自定義活動的參數綁定在一起。OutArument<T>:表示數據流出活動的綁定終端。類名:System.Activities.OutArgument<T>程序集:System.Activities(在System.Activities.dll中)語法:[ContentPropertyAttribute("Expression”)] [TypeConverterAttribute(typeof(OutArgumentConverter))]publicsealedclassOutArgument<T>:OutArgument 使用說明:可以用VS設計器在xaml中定義Out參數在xaml中定義的Out參數,可以在該xaml中被其他Activity用表達式綁定可以用code方式在codeActivity中定義Out參數可以在屬性框中,將codeActivity中定義的Out參數綁定到參數或變量,不能直接對Out參數賦值運行時,不能用啟動參數的方式對Out參數賦值(xaml和code方式都不能)Out參數可以在實例的OnCompleted事件中用WorkflowApplicationCompletedEventArgs.Outputs得到??梢允褂肁ssign為Out參數賦值示例:在xaml形式的流程圖中使用Out參數先在流程圖TestOutXamlWorkflow.xaml文件中定義2個double型的In參數v1,v2,和定義一個double型的Out參數v3;啟動時為v1,v2賦值在流程內部用Assign為v3賦予v1+v2在completed中打印v3的值啟動時賦值的代碼如下: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());}在自定義代碼活動中使用Out參數自定義活動代碼如下:publicsealedclassTestOutCodeActivity:CodeActivity{publicOutArgument<string>Text{get;set;}protectedoverridevoidExecute(CodeActivityContextcontext){stringstr1=context.GetValue(this.Text);//得到Text參數值的第一種方式context.SetValue(Text,“ABC”+str1);//設置Text參數值的第一種方式stringstr2=Text.Get(context);//得到Text參數值的第二種方式Text.Set(context,“ABC”+str2);//設置Text參數值的第二種方式Console.WriteLine(Text.Get(context));}}創建WorkflowApplication實例啟動流程,代碼如下:WorkflowApplicationmyOut=newWorkflowApplication(newTestOutXamlWorkflow());myOut.Run();在Xaml形式的流程圖中使用帶參數的自定義活動,需要在流程圖中添加參數或變量并與自定義活動的參數綁定在一起。InOutArument<T>:表示數據流入和流出活動的綁定終端。類名:System.Activities.InOutArgument<T>程序集:System.Activities(在System.Activities.dll中)語法:[ContentPropertyAttribute("Expression”)] [TypeConverterAttribute(typeof(InOutArgumentConverter))]publicsealedclassInOutArgument<T>:InOutArgument 使用說明:可以用VS設計器在xaml中定義In/Out參數在xaml中定義的In/Out參數,可以在該xaml中被其他Activity用表達式綁定可以用code方式在codeActivity中定義In/Out參數可以在屬性框中,將codeActivity中定義的In/Out參數綁定到參數或變量,不能直接對In/Out參數賦值運行時,可以用啟動參數的方式對In/Out參數賦值(xaml和code方式都可以)In/Out參數可以在實例的OnCompleted事件中用WorkflowApplicationCompletedEventArgs.Outputs得到??梢允褂肁ssign為In/Out參數賦值示例:在xaml形式的流程圖中使用In/Out參數先在流程圖TestInOutXamlWorkflow.xaml文件中定義3個string型的In/Out參數v1,v2,v3;啟動時為v1,v2,v3賦值在流程內部用Assign為v3賦予v1+v2+v3在completed中打印v3的值啟動流程代碼: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());}在自定義代碼活動中使用In/Out參數自定義活動代碼如下:publicsealedclassTestInOutCodeActivity:CodeActivity{publicInOutArgument<string>Text{get;set;}protectedoverridevoidExecute(CodeActivityContextcontext){stringstr=context.GetValue(this.Text);context.SetValue(Text,“你好:”+str);Console.WriteLine(context.GetValue(this.Text));}}啟動代碼如下:System.Collections.Generic.Dictionary<string,object>dic=newSystem.Collections.Generic.Dictionary<string,object>();dic.Add(“Text”,”Victor”);WorkflowApplicationmyInOut=newWorkflowApplication(newTestInOutCodeActivity(),dic);myInOut.Run();在Xaml形式的流程圖中使用帶參數的自定義活動,需要在流程圖中添加參數或變量并與自定義活動的參數綁定在一起。返回單個值的活動可從Activity、NativeActivity或CodeActivity派生。這些活動擁有定義完善的名為Result的OutArgument,它包含活動的返回值。七數據的傳遞(變量與參數的使用)In參數:與該參數關聯的變量值可傳入內部;內部修改參數時,關聯的變量不會更改。示例:定義一個自定義活動,代碼如下:publicsealedclassTestInChangeCodeActivity:CodeActivity{publicInArgument<string>Text{get;set;}protectedoverridevoidExecute(CodeActivityContextcontext){stringstr1=context.GetValue(this.Text);//得到從外部變量傳入的值Console.WriteLine(“傳入值為:{0}”,str1);Context.SetValue(Text,”BB”);//修改參數的值stringstr2=context.GetValue(this.Text);Console.WriteLine(“內部修改為:{0}”,str2);}}在xaml工作流中創建了一個變量,并賦值為“AA”,然后將上面自定義活動的Text參數和變量綁定,最后打印出變量的值。結果如下:Out參數:與該參數關聯的變量值無法傳入內部;內部修改參數時,關聯的變量也會更改。示例:將上面[In參數]示例中自定義活動中的參數類型修改為OutArgument<string>,其他的不變。結果如下:In/Out參數:與該參數關聯的變量值可以傳入內部;內部修改參數時,關聯的變量也會更改。示例:將上面[In參數]示例中自定義活動中的參數類型修改為InOutArgument<string>,其他的不變。結果如下:八控制流ActivityIf:建立If-Then-Else條件的模型。類名:System.Activities.Statements.If程序集:System.Activities(在System.Activities.dll中) 語法:publicsealedclassIf:NativeActivity 屬性:Condition屬性:用于確定要執行哪個子活動的條件。Then活動在條件解析為true的情況下執行。Else活動在條件解析為false的情況下執行。語法:[RequiredArgumentAttribute]publicInArgument<bool>Condition{get;set;}Then屬性:要在活動的Condition解析為true的情況下執行的活動。語法:publicActivityThen{get;set;}Else屬性:要在活動的Condition解析為false的情況下執行的活動。語法:publicActivityElse{get;set;}Switch<T>:基于給定表達式(其類型在此對象的類別說明符中指定)的值,從要執行的多個活動中選擇一個活動。類名:System.Activities.Statements.Switch<T>程序集:System.Activities(在System.Activities.dll中) 語法:[ContentPropertyAttribute("Cases”)]publicsealedclassSwitch<T>:NativeActivity 屬性:Expression屬性:獲取要與Cases()集合中的鍵進行比較的對象。語法:[RequiredArgumentAttribute]publicInArgument<T>Expression{get;set;}Cases屬性:表示可能執行路徑的字典。每個條目都包含一個鍵以及一個將在表達式結果與該鍵匹配時執行的活動。語法:publicIDictionary<T,Activity>Cases{get;}Default屬性:表示在Cases()集合中沒有條目鍵與Expression()屬性匹配的情況下執行的活動。語法:publicActivityDefault{get;set;}While:在條件的計算結果為true時執行包含的工作流元素。類名:System.Activities.Statements.While程序集:System.Activities(在System.Activities.dll中) 語法:ContentPropertyAttribute("Body")]publicsealedclassWhile:NativeActivity 屬性:Condition屬性:要在While循環的每次迭代之前執行的Activity<Tresult>。語法:publicActivity<bool>Condition{get;set;}Body屬性:要在While循環中執行的Activity。語法:publicActivityBody{get;set;}Variables屬性:與While活動關聯的Variable對象的集合。語法:publicCollection<Variable>Variables{get;}DoWhile:一個循環活動,該活動將執行包含的活動至少一次,直至條件不再為true為止。類名:System.Activities.Statements.DoWhile程序集:System.Activities(在System.Activities.dll中) 語法:ContentPropertyAttribute("Body")]publicsealedclassDoWhile:NativeActivity 屬性:Condition屬性:在循環結尾進行檢查以確定是否再次執行循環的[T:System.Activities.Activity]。語法:publicActivity<bool>Condition{get;set;}Body屬性:要隨每次迭代一起執行的子活動。語法:publicActivityBody{get;set;}Variables屬性:與DoWhile活動關聯的Variable對象的集合。語法:publicCollection<Variable>Variables{get;}ForEach<T>:為Values集合中提供的每個值執行活動操作一次。類名:System.Activities.Statements.ForEach<T>程序集:System.Activities(在System.Activities.dll中) 語法:ContentPropertyAttribute("Body")]publicsealedclassForEach<T>:NativeActivity 屬性:Body屬性:要為Values集合中的每一項執行的ActivityAction。語法:publicActivityAction<T>Body{get;set;}Values屬性:活動的輸入集合,用于執行Body活動操作。語法:[RequiredArgumentAttribute]publicInArgument<IEnumerable<T>>Values{get;set;}九控制流Activity(二)Parallel:一個以異步方式同時執行所有子活動的活動。類名:System.Activities.Statements.Parallel程序集:System.Activities(在System.Activities.dll中) 語法:ContentPropertyAttribute("Branches")]publicsealedclassParallel:NativeActivity 屬性:CompletionCondition屬性:在任何分支完成后計算。語法:publicActivity<bool>CompletionCondition{get;set;}說明:如果此屬性的計算結果為true,則會取消Branches集合中其他安排的元素。如果未設置此屬性,則Branches集合中的所有Activity對象都將執行,直至完成為止。Branches屬性:要并行執行的子元素。語法:publicCollection<Activity>Branches{get;}Variables屬性:包含的變量的集合。語法:publicCollection<Variable>Variables{get;}說明:Parallel活動的工作方式為:在啟動時同時安排其Branches集合中的每個Activity。該活動將在所有其Branches均完成或其CompletionCondition屬性的計算結果為true時完成。盡管所有Activity對象均異步運行,但它們不會在單獨的線程上運行,因此每個連續的活動將只會在以前安排的活動完成或進入空閑狀態時執行。如果此活動沒有任何子活動進入空閑狀態,則此活動將采用與Sequence活動相同的方式執行。Parallel中可以定義變量Parallel會并行執行Branches集合內的所有Activity當CompletionCondition屬性為true時,并行容器完成,其他沒有執行完成的分支就不再執行了(包括執行一半的分支)示例:基本使用1、在流程中添加[WriteLine]打印當前時間2、添加[Parallel],并添加兩個分支第一個分支添加[Delay]延時10秒,添加[WriteLine]打印當"A"第二個分支添加[Delay]延時15秒,添加[WriteLine]打印當"B"3、在流程中添加[WriteLine]打印當前時間預期:兩次的系統時間差為15秒表示為并行,兩次的系統時間差為25秒表示為串行結果:CompletionCondition使用1、在流程中添加bool型變量[myVariable],默認值False2、添加[Parallel],并添加三個分支第一個分支:添加[WriteLine]打印當"A1";添加[Delay]延時10秒;添加[WriteLine]打印當"A2"第二個分支:添加[WriteLine]打印當"B1";添加[Delay]延時15秒;添加[WriteLine]打印當"B2";添加[Assign]為變量[myVariable]賦值True第三個分支:添加[WriteLine]打印當"C1";添加[Delay]延時20秒;添加[WriteLine]打印當"C2"預期:[Assign]為變量[myVariable]賦值True后,容器結束,因此會依次看到[A1,B1,C1,A2,B2],但看不到[C2]結果:Pick:提供基于事件的控制流建模。類名:System.Activities.Statements.Pick程序集:System.Activities(在System.Activities.dll中) 語法:ContentPropertyAttribute("Branches")]publicsealedclassPick:NativeActivity 屬性:Branches屬性:PickBranch對象的集合,Pick活動可能會基于傳入的事件執行其中的一個活動。語法:publicCollection<PickBranch>Branches{get;}說明: 此活動的行為與Switch的類似之處在于:它只執行若干活動中的一個活動來響應事件。選擇執行的活動由從一組事件中選擇的一個事件定義。PickBranch:Pick活動內的可能執行路徑。類名:System.Activities.Statements.PickBranch程序集:System.Activities(在System.Activities.dll中) 語法:ContentPropertyAttribute("Action")]publicsealedclassPickBranch 屬性:Action屬性:要在已觸發執行此分支的情況下執行的Activity。語法:publicActivityAction{get;set;}DisplayName屬性:在活動設計器中顯示的此分支的名稱。語法:publicstringDisplayName{get;set;}Trigger屬性:其完成激活此pick分支的活動。語法:publicActivityTrigger{get;set;}Variables屬性:與此活動關聯的用戶定義變量的集合。語法:publicCollection<Variable>Variables{get;}說明: PickBranch包含Trigger和Action。開始執行Pick元素時,會安排所有PickBranch元素中的所有觸發器活動。在第一個活動完成之后,安排其相應的操作活動,并且取消所有其他觸發器活動。Pick和PickBranch的一些說明:●Pick觸發容器,提供了基于事件的控制流。Branches集合是觸發容器的分支集合,只能添加PickBranch●Pick觸發容器中可以定義變量●PickBranch只可添加到Pick中,PickBranch.Trigger只能放入觸發類Activity;PickBranch.Action當PickBranch.Trigger被觸發時,所要執行的●只要有一個PickBranch的Trigger被觸發,其他PickBranch就不會被觸發了●即使在被執行的PickBranch還沒完成時,其他PickBranch也不會被觸發示例:基本使用1、在工作流中添加[WriteLine],打印系統時間2、在工作流中添加[Pick],添加三個[PickBranch]第一個分支:[Trigger]添加[Delay]延時15秒[Action]添加[WriteLine]打印當"A"第二個分支:[Trigger]添加[Delay]延時10秒[Action]添加[WriteLine]打印當"B1"添加[Delay]延時15秒添加[WriteLine]打印當"B2"第三個分支:[Trigger]添加[Delay]延時20秒[Action]添加[WriteLine]打印當"C"預期:只有第二個分支會被執行結果:ParallelForEach<T>:枚舉集合元素并對集合中的每個元素并行執行嵌入語句。類名:System.Activities.Statements.ParallelForEach<T>程序集:System.Activities(在System.Activities.dll中) 語法:ContentPropertyAttribute("Body")]publicsealedclassParallelForEach<T>:NativeActivity 屬性:CompletionCondition屬性:在每個迭代完成后計算。語法:publicActivity<bool>CompletionCondition{get;set;}說明:如果其計算結果為true,則取消已安排的掛起的迭代。如果未設置此屬性,則所有安排的語句都將執行,直至完成為止。Body屬性:為Values集合中包含的每個值執行一次的ActivityAction。語法:publicActivityAction<T>Body{get;set;}Values屬性:值的集合,用作Body中所包含活動的每個迭代的參數。語法:[RequiredArgumentAttribute]publicInArgument<IEnumerable<T>>Values{get;set;}說明:嵌入的語句將一起安排并異步運行,但它們不會在單獨的線程上運行,因此每個連續的活動將只會在以前安排的活動完成或進入空閑狀態時執行。如果此活動沒有任何子活動進入空閑狀態,則此活動將采用與ForEach<T>活動相同的方式執行。 示例: ①基本使用1、創建一codeactivity名為CollectionCodeActivity,具有Out參數,類型為List<string>的參數myOutCollection2、在流程中添加List<string>變量myCollection3、在流程中添加CollectionCodeActivity,將CollectionCodeActivity.myOutCollection參數綁定到myCollection變量4、在流程中添加ForEach<T>,TypeArgument屬性指定string,Values屬性綁定到myCollection變量,在Body中添加WriteLine,打印item自定義活動代碼如下: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);}}結果:十Collection集合操作AddToCollection<T>:向指定集合中添加項。類名:System.Activities.Statements.AddToCollection<T>程序集:System.Activities(在System.Activities.dll中) 語法:ContentPropertyAttribute("Collection")]publicsealedclassAddToCollection<T>:CodeActivity 屬性:Collection屬性:接收新項的集合。語法:[RequiredArgumentAttribute]publicInArgument<ICollection<T>>Collection{get;set;}Item屬性:要添加到指定集合中的項。語法:[RequiredArgumentAttribute]publicInArgument<T>Item{get;set;}RemoveFromCollection<T>:從指定集合中移除項。類名: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中移除的項。語法:[RequiredArgumentAttribute]publicInArgument<T>Item{get;set;}Result屬性:表示操作結果,如果操作成功返回True,不成功返回False說明:如果集合中的有兩個相同的項,只移除第一個。ClearCollection<T>:從指定集合中移除項。類名:System.Activities.Statements.ClearCollection<T>程序集:System.Activities(在System.Activities.dll中) 語法:ContentPropertyAttribute("Collection")]publicsealedclassClearCollection<T>:CodeActivity 屬性:Collection屬性:要清除其內容的集合。語法:[RequiredArgumentAttribute]publicInArgument<ICollection<T>>Collection{get;set;}ExistsInCollection<T>:指示給定項是否存在于給定集合中。類名:System.Activities.Statements.ExistsInCollection<T>程序集:System.Activities(在System.Activities.dll中) 語法:ContentPropertyAttribute("Collection")]publicsealedclassExistsInCollection<T>:CodeActivity<bool> 屬性:Collection屬性:要進行搜索以查找指定元素的集合。語法:[RequiredArgumentAttribute]publicInArgument<ICollection<T>>Collection{get;set;}Item屬性:要在指定集合中搜索的項。語法:[RequiredArgumentAttribute]publicInArgument<T>Item{get;set;}Result屬性:表示查找結果,如果存在成功返回True,不存在返回False十一Exception異常與TerminateWorkflow結束異常WF為在工作流中處理運行時錯誤條件提供了多個不同機制。工作流可以結合使用異常處理程序、事務以及補償來妥善處理錯誤條件并從中恢復。工作流可以使用TryCatch活動處理工作流執行期間引發的異常??梢詫@些異常進行處理,或者使用Rethrow活動重新引發異常。Finally節中的活動在Try節或Catches節完成時執行。工作流還可以使用WorkflowInstance的OnUnhandledException事件處理程序處理未由TryCatch活動處理的異常。異常的原因:在工作流中,異??赡芡ㄟ^下列方式生成:●TransactionScopeActivity中的事務超時?!窆ぷ髁魍ㄟ^使用Throw活動引發的顯式異常?!衲硞€活動引發的.NETFramework4異常。●外部代碼引發的異常,例如工作流中使用的庫、組件或服務。WF流程結束方式:WF實例如果在運行過程中沒有出現問題,ActivityInstanceState(實例狀態)會由Executing(執行中)變為Closed(關閉)。如果流程被調用Terminate方法遇到TerminateWorkflow活動產生異常時沒有用WorkflowApplication.OnUnhandledException產生異常時指定UnhandledExceptionAction.TerminateActivityInstanceState(實例狀態)會由Executing(執行中)變為faulted(有問題)。如果流程被調用Canceled方法產生異常時指定UnhandledExceptionAction.CanceledActivityInstanceState(實例狀態)會由Executing(執行中)變為Canceled(取消)。如果流程被調用Aborted方法產生異常時指定UnhandledExceptionAction.Aborted流程會運行失敗,并觸出發實例的Aborted運行失敗的流程無ActivityInstanceState(實例狀態)。ActivityInstanceState(實例狀態)的Closed(關閉),faulted(有問題),Canceled(取消)都表示流程結束,并觸出發實例的Completed。流程Aborted(中止),流程會即時消失,觸出發實例的Aborted,不會觸出發實例的Completed。WorkflowApplication的幾個屬性:●Aborted屬性:獲取或設置中止工作流實例時調用的Action<T>。語法:publicAction<WorkflowApplicationAbortedEventArgs>Aborted{get;set;}屬性值類型:SystemAction<WorkflowApplicationAbortedEventArgs>終止工作流實例時調用的操作。●Completed屬性:獲取或設置工作流實例完成時調用的Action<T>。語法:publicAction<WorkflowApplicationCompletedEventArgs>Completed{get;set;}屬性值類型:SystemAction<WorkflowApplicationCompletedEventArgs>工作流實例完成時調用的操作?!馡del屬性:獲取或設置當前工作流實例進入空閑狀態時調用的Action<>。語法:publicAction<WorkflowApplicationIdleEventArgs>Idle{get;set;}屬性值類型:SystemAction<WorkflowApplicationIdleEventArgs>工作流實例進入空閑狀態時執行的操作。●OnUnhandledException屬性:獲取或設置當前工作流實例遇到未處理的異常時調用的Func<T,Tresult>。語法:publicFunc<WorkflowApplicationUnhandledExceptionEventArgs,UnhandledExceptionAction>OnUnhandledException{get;set;}屬性值類型:SystemFunc<WorkflowApplicationUnhandledExceptionEventArgs,UnhandledExceptionAction>工作流實例遇到未處理的異常時調用的委托。●PersistableIdle屬性:獲取或設置當前工作流實例處于空閑狀態并可被保留時調用的ActivityFunc。語法:publicFunc<WorkflowApplicationIdleEventArgs,PersistableIdleAction>PersistableIdle{get;set;}屬性值類型:SystemFunc<WorkflowApplicationIdleEventArgs,PersistableIdleAction>當前工作流實例處于空閑狀態并可被保留時調用的ActivityFunc?!馯nloaded屬性:獲取或設置卸載當前工作流時調用的Action<T>。語法:publicAction<WorkflowApplicationEventArgs>Unloaded{get;set;}屬性值類型:SystemAction<WorkflowApplicationEventArgs>卸載工作流實例時調用的操作。使用WorkflowApplication.OnUnhandledException處理Code異常如果異常由某個活動引發并且未經處理,則默認行為是終止該工作流實例。如果存在自定義OnUnhandledException處理程序,則它會重寫此默認行為。通過此處理程序,工作流宿主作者能夠提供合適的處理操作,例如自定義日志記錄、中止工作流、取消工作流或終止工作流。示例:處理Code異常,下面是產生Code異常的Activity的代碼:publicsealedclassTestCodeExceptionActivity:CodeActivity{protectedoverridevoidExecute(CodeActivityContextcontext){intv=1–1;doublei=1/v;}}工作流完成時調用的Action代碼如下:staticvoidworkflowCompleted(WorkflowApplicationCompletedEventArgse){Console.WriteLine("工作流順利完成,實例編號:{0},狀態:{1}",e.InstanceId,e.CompletionState.ToString());}工作流中止時調用的Action代碼如下:staticvoidworkflowAborted(WorkflowApplicationAbortedEventArgse){Console.WriteLine("工作流被中止,實例編號:{0},Reason:{1}",e.InstanceId,e.Reason.Message);}工作流遇到未處理的異常時返回UnhandledExceptionAction.Abort代碼如下:staticUnhandledExceptionActionunhandledException_Abort(WorkflowApplicationUnhandledExceptionEventArgse){Console.WriteLine("遇到未處理的異常_Abort:{0}",e.UnhandledException.Message);returnUnhandledExceptionAction.Abort;}工作流遇到未處理的異常時返回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();}結果:使用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();}結果:使用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();}結果:使用UnhandledExceptionAction.Cancel方式如果異常出現在Cancellation
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年舞蹈表演藝術專業考試題目及答案
- 2025年初中數學復習試題及答案
- 2025年國防教育與安全意識考試題目及答案
- 2025年風景園林專業考試試卷及答案
- 2025年護士執業資格證考試試卷及答案
- 2025年農業技術推廣考試試卷及答案
- 2025年保定市中考二模語文試題及答案
- 河道保潔項目招標文件
- 成都市建設工程材料檢測監管系統建設施工監理檢測單位作業指導書
- 七下地理試題及答案
- 孩子心理成長中家長角色的科學定位
- 《推進鄉村振興中的的政府行為研究國內外文獻綜述》5100字
- 小學生反詐騙班會課件
- 康養休閑旅游服務基礎知識單選題及答案解析
- 公司師徒制、導師制管理辦法(完整版方案)
- 解剖學公開課課件內分泌
- 家族財富管理
- 高中必修一英語單詞湘教版
- 森林防火預警監測
- 銀屑病臨床病例討論
- 【MOOC】工程經濟學原理-東南大學 中國大學慕課MOOC答案
評論
0/150
提交評論