Windows WorkFlow Foundation入門(三)
WF支持的CodeDOM類型
WF System.CodeDOM。你可使用這些類型來創建你的表達式,其中一些用于條件(conditions),一些用于規則(actions),還有一些能用于兩者。
注意:CodeDOM不支持一元操作符,也不支持不等操作符,如a!=b,你可以換成這樣表達:(a==b)==false
下表列出了WF所支持的CodeDOM類型。
|
類 |
用于 |
|
CodeAssignStatement |
Actions |
|
CodeBinaryOperatorExpression |
Conditions |
|
CodeDirectionExpression |
Conditions |
|
CodeExpressionStatement |
Actions |
|
CodeFieldReferenceExpression |
Conditions |
|
CodeMethodInvokeExpression |
Conditions |
|
CodeMethodReferenceExpression |
Conditions |
|
CodePrimitiveExpression |
Conditions |
|
CodePropertyReferenceExpression |
Conditions |
|
CodeThisReferenceExpression |
Conditions |
|
CodeTypeReference |
As part of expressions |
|
CodeTypeReferenceExpression |
Conditions |
|
CodeBinaryOperatorType |
Supported in |
|
Add |
Conditions, Actions |
|
BitwiseAnd |
Conditions, Actions |
|
BitwiseOr |
Conditions, Actions |
|
BooleanAnd |
Conditions, Actions |
|
BooleanOr |
Conditions, Actions |
|
Divide |
Conditions, Actions |
|
GreaterThan |
Conditions, Actions |
|
GreaterThanOrEqual |
Conditions, Actions |
|
IdentityEquality |
Conditions, Actions |
|
IdentityInequality |
Conditions, Actions |
|
LessThan |
Conditions, Actions |
|
LessThanOrEqual |
Conditions, Actions |
|
Modulus |
Conditions, Actions |
|
Multiply |
Conditions, Actions |
|
Subtract |
Conditions, Actions |
|
ValueEquality |
Conditions, Actions |
在工作流中使用事務
WF提供的TransactionScopeActivity封裝了.NET System.Transactions的事務功能,可以在操作發生錯誤時自動回滾,從而支持從事務失敗中恢復。請參考MSDN中獲取System.Transactions.Transaction和System.Transactions.TransactionScope類的更詳細信息。
工作流中的批處理狀態信息
工作流會周期性在各個檢查點保存它有狀態,如果發生錯誤,工作流引擎有必要檢索保存過的信息來返回到一個穩定的狀態。如果兩個以上的組件正在通信,那么組件間的coordinate persistence有助于保證組件的一致性。
這一點在發送或接收消息時尤其有用。例如,一個工作流可能發送多條消息,每個發送的操作都會請求消息服務。消息服務必須要維護工作流的一致性和持續的狀態,只有工作流狀態被成功保存,消息才能被發送。這意味著在單個的事務中,工作流狀態以及消息發送狀態都會被保存起來,以保存所有組件間狀態的一致性。
WF提供了System.Workflow.Runtime.IWorkBatch 和 System.Workflow.Runtime.IpendingWork兩個接口來解決這個問題。
在對服務所有調用中,運行時引擎在自己的線程上下文中提供了System.Workflow.Runtime.IworkBatch,你可以添加一個掛起的工作項到批處理中,這樣運行時引擎可以一次性將所有相關的工作項提交到事務處理。
在ExternalDataEventArgs的構造函數中,可以傳遞一個IpendingWork類型的參數。
當組件被請求時的執行順序
1、在第一次請求前,工作流創建工作批處理對象。
2、工作流將工作批處理傳對象遞到到組件的請求方法中。
3、組件創建一個工作項,并將其添加到工作批處理對象中。
其它組件請求時,重復第二步和第三步。
在事務提交點的執行順序
1、工作流創建一個事務
2、工作流遍歷工作批處理對象中的工作項,并收集其中屬于某一組件的工作項,維護其順序,然后創建一個新工作批處理對象。工作流調用組件的Commit方法,并把事務對象和這個批處理對象傳遞給它。
3、組件把工作批處理對象中的工作添加到事務中。
對所有的組件重復第二步和第二步。
當組件的Commnit方法成功調有后,工作注提交相應的事務。
當事務成功提交后,工作流遍歷工作批處理中工作項,如第二步一樣。工作流調用每個組件的Complete方法,交把事務對象和批處理對象傳遞給它。
工作流發生錯誤時的執行順序
1、工作流識別錯誤范圍內的所有工作項并構造一個工作批處理對象,并將這些工作項添加這個工作批處理對象中。對于2、工作批處理中所有工作,工作流通過IPendingWork接口來調用其Complete方法,并傳遞完成狀態為false
3、工作流取消工作批處理中的所有工作。
從錯誤中恢復后,運行時維護剩余的工作批處理項引用。
浙公網安備 33010602011771號