WorkflowRuntime イベントの処理
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 |
ワークフロー ランタイム エンジンが実行を停止したときに発生します。 |
次の表は、ワークフロー ランタイム エンジンによって発生されるワークフロー インスタンス イベントの一覧です。
イベント | 説明 | ||
---|---|---|---|
ワークフローが処理中に停止したときに発生します。 |
|||
ワークフローの処理が完了したときに発生します。 |
|||
ワークフローがインスタンス化されたときに発生します。 |
|||
ワークフローがアイドル状態になると発生します。 |
|||
ワークフローがストレージ メディアから再作成されたときに発生します。 |
|||
ワークフローの現在の状態がストレージ メディアに永続化されたときに発生します。 |
|||
ワークフローが停止またはアンロードされた後に実行を再開したときに発生します。 |
|||
ワークフローが実行を開始したときに発生します。 |
|||
ワークフローが一時停止状態になると発生します。 |
|||
ワークフローが終了したときに発生します。 |
|||
ワークフローがアンロードされたときに発生します。 |
ワークフローの中止条件
ワークフローの実行時には、WorkflowAborted イベントを発生するさまざまな条件が発生します。たとえば、ホスト アプリケーションは、WorkflowInstance オブジェクトから Abort メソッドを呼び出してプロセスに介入できます。この場合、理由は明確であり、これを処理するロジックをホスト アプリケーション内に簡単に作成できます。
ただし、Windows Workflow Foundation ランタイム エンジンによってワークフローが中止される場合には条件があります。ワークフロー インスタンスの終了に失敗したランタイム エンジンの結果は、この条件の一例です。この条件に関連する一般的なシナリオには、SqlWorkflowPersistenceService が関係します。ワークフロー ランタイム エンジンがワークフローを終了する必要がある場合、SqlWorkflowPersistenceService がアクティブであれば、ランタイム エンジンはワークフローの状態を永続化しようとします。ただし、永続化の操作時に SqlException がスローされた場合は、ランタイム エンジンがワークフロー インスタンスを中止する必要があります。その場合、TrackingService を使用すると、ランタイム エンジンがワークフロー インスタンスを中止する原因になったシナリオをデバッグするための例外情報をダンプできます。
ワークフローの終了の原因の特定
WorkflowTerminated イベントは、ワークフロー内で TerminateActivity を使用してホスト アプリケーションからプログラムによって発生するか、キャッチされていない例外の結果として発生することができます。ホスト アプリケーションで、ワークフローを終了させる原因になったアクションの種類に基づいて特定のロジックを実行する必要がある場合は、主要なロジックのいくつかをチェックする必要があります。次の表に、ワークフローのさまざまな状態と、終了の原因に関する情報を探す場所を示します。
アクション | ワークフロー ステータス | アクティビティ実行ステータス | 終了または一時停止の情報 |
---|---|---|---|
正常実行 |
Completed |
Closed |
NULL |
TerminateActivity (理由が特定され、NULL 以外) |
Terminated |
Executing |
ワークフロー デザイン内で指定された理由 |
TerminateActivity (理由は NULL) |
Terminated |
Executing |
Workflow Terminated がスローされた例外の種類 |
ホスト アプリケーションからの終了 |
Terminated |
Executing |
Terminate メソッド パラメータに指定された理由 |
未処理の例外 |
Terminated |
Closed |
終了の原因になった例外のメッセージ |
フォールト ハンドラでの未処理の例外 |
Terminated |
Closed |
終了の原因になった例外のメッセージ |
ワークフロー内の例外がスローされた場所は、ワークフロー グラフを調べ、終了時の各アクティビティのステータスをチェックすると見つけられます。次のコードは、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.