次の方法で共有


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 ランタイム エンジンによって発生されるイベントの一覧です。

イベント 説明

ServicesExceptionNotHandled

WorkflowRuntimeService 抽象クラスから派生したサービスが RaiseServicesExceptionNotHandledEvent メソッドを呼び出したときに、ワークフローの実行時にサービスが処理できない例外が起きたために発生します。

Started

ワークフロー ランタイム エンジンが実行を開始したときに発生します。

Stopped

ワークフロー ランタイム エンジンが実行を停止したときに発生します。

次の表は、ワークフロー ランタイム エンジンによって発生されるワークフロー インスタンス イベントの一覧です。

イベント 説明

WorkflowAborted

ワークフローが処理中に停止したときに発生します。

WorkflowCompleted

ワークフローの処理が完了したときに発生します。

WorkflowCreated

ワークフローがインスタンス化されたときに発生します。

WorkflowIdled

ワークフローがアイドル状態になると発生します。

WorkflowLoaded

ワークフローがストレージ メディアから再作成されたときに発生します。

WorkflowPersisted

ワークフローの現在の状態がストレージ メディアに永続化されたときに発生します。

WorkflowResumed

ワークフローが停止またはアンロードされた後に実行を再開したときに発生します。

WorkflowStarted

ワークフローが実行を開始したときに発生します。

WorkflowSuspended

ワークフローが一時停止状態になると発生します。

WorkflowTerminated

ワークフローが終了したときに発生します。

WorkflowUnloaded

ワークフローがアンロードされたときに発生します。

ワークフローの中止条件

ワークフローの実行時には、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;
}

関連項目

概念

ワークフローの実行
WorkflowRuntime の作成

Copyright © 2007 by Microsoft Corporation. All rights reserved.