Windows Workflow 執行階段引擎在其整個存留期會引發數個主應用程式可處理的事件。這些事件包括會在執行階段引擎為 Started 或 Stopped 時通知您應用程式的事件,以及數個對應至任何執行中工作流程執行個體存留期的事件。為這些事件建立事件處理常式的程序遵循 .NET Framework 中提供的相同事件處理模式。例如,下列程式碼會建立 Started 事件的事件處理常式,這個事件是在它開始執行時由工作流程執行階段所引發。
AddHandler workflowRuntime.Started, AddressOf OnWorkflowStarted
...
Shared Sub OnWorkflowStarted(ByVal sender As Object, ByVal e As WorkflowRuntimeEventArgs)
Console.WriteLine("WorkflowRuntime started")
End Sub
workflowRuntime.Started += delegate(object sender, WorkflowRuntimeEventArgs e)
{
Console.WriteLine("WorkflowRuntime started");
};
下表列出與工作流程執行階段引擎本身相關的 Windows Workflow 執行階段引擎所引發的事件。
| 事件 | 描述 |
|---|---|
當衍生自 WorkflowRuntimeService 抽象類別的服務呼叫 RaiseServicesExceptionNotHandledEvent 方法時引發,因為在服務無法處理的工作流程執行期間發生例外狀況。 |
|
Started |
當工作流程執行階段引擎開始執行時引發。 |
Stopped |
當工作流程執行階段引擎停止執行時引發。 |
下表列出可由工作流程執行階段引擎引發的工作流程執行個體事件。
| 事件 | 描述 | ||
|---|---|---|---|
|
當在處理之中停止工作流程時引發。 |
|||
|
當工作流程完成處理時引發。 |
|||
|
當執行個體化工作流程時引發。 |
|||
|
當工作流程進入閒置狀態時引發。 |
|||
|
當從儲存媒體重新建立工作流程時引發。 |
|||
|
當工作流程的目前狀態保存在儲存媒體時引發。 |
|||
|
當工作流程在停止或卸載後繼續執行時引發。 |
|||
|
當工作流程開始執行時引發。 |
|||
|
當工作流程進入暫停狀態時引發。 |
|||
|
當終止工作流程時引發。 |
|||
|
當卸載工作流程時引發。 |
WorkflowAbort 條件
有數種不同的狀況會在執行引發 WorkflowAborted 事件的工作流程期間發生。例如,主應用程式會從 WorkflowInstance 物件呼叫 Abort 方法來介入程序。在此狀況中,原因為已知,且處理此事的邏輯可以很容易的在主應用程式本身中建立。
但是,當 Windows Workflow Foundation 執行階段引擎中止工作流程時有一些狀況。舉例來說,執行階段引擎無法終止工作流程執行個體時便會發生這個狀況。與這個狀況有關的常見案例與 SqlWorkflowPersistenceService 有關。如果工作流程執行階段引擎必須終止工作流程,且 SqlWorkflowPersistenceService 為作用中,則執行階段引擎會嘗試保留工作流程狀態。但是,如果在持續作業期間擲回 SqlException,則執行階段引擎必須中止工作流程執行個體。發生這種情況時,您可以使用 TrackingService 來傾印例外狀況資訊,以偵錯造成執行階段引擎中止工作流程的案例。
判斷工作流程終止的來源
WorkflowTerminated 事件可透過主應用程式以程式設計的方式引發,會使用工作流程中的 TerminateActivity 或做為無法攔截例外狀況的結果來引發。如果您的主應用程式必須根據造成工作流程終止的動作類型來執行某些邏輯,則您必須檢查數個重要的邏輯。下表顯示工作流程的不同狀態,以及可找出有關終止原因之資訊的位置。
| 動作 | 工作流程狀態 | 活動執行狀態 | 終止或暫停資訊 |
|---|---|---|---|
正常執行 |
已完成 |
已關閉 |
NULL |
TerminateActivity (已指定原因且非 NULL) |
已終止 |
正在執行 |
在工作流程設計中指定的原因 |
TerminateActivity (原因為 NULL) |
已終止 |
正在執行 |
擲回已終止工作流程類型的例外狀況 |
從主應用程式終止 |
已終止 |
正在執行 |
在 Terminate 方法參數中指定的原因 |
未處理的例外狀況 |
已終止 |
已關閉 |
造成終止之例外狀況的訊息 |
錯誤處理常式中未處理的例外狀況 |
已終止 |
已關閉 |
造成終止之例外狀況的訊息 |
瀏覽工作流程圖,並檢查終止時每個活動的狀態,可找到工作流程中擲回例外狀況的位置。下列程式碼示範當從 FaultHandlerActivity 擲回例外狀況時如何完成。
Private Function isExceptionfromFaultHandler(ByVal rootActivity As Activity) As Boolean
If rootActivity Is Nothing Then
Return False
End If
If TypeOf rootActivity Is CompositeActivity Then
If TypeOf rootActivity Is FaultHandlersActivity Then
If rootActivity.ExecutionStatus = ActivityExecutionStatus.Closed Then
Return True
End If
End If
For Each act As Activity In (CType(rootActivity, CompositeActivity)).Activities
If isExceptionfromFaultHandler(act) Then
Return True
End If
Next
End If
Return False
End Function
bool isExceptionfromFaultHandler(Activity rootActivity)
{
if (rootActivity == null)
return false;
if (rootActivity is CompositeActivity)
{
if (rootActivity is FaultHandlersActivity)
{
if (rootActivity.ExecutionStatus == ActivityExecutionStatus.Closed)
return true;
}
foreach (Activity act in ((CompositeActivity)rootActivity).Activities)
if (isExceptionfromFaultHandler(act))
return true;
}
return false;
}
請參閱
概念
Copyright © 2007 by Microsoft Corporation.All rights reserved.