다음을 통해 공유


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

워크플로가 언로드될 때 발생합니다.

WorkflowAbort 조건

WorkflowAborted 이벤트를 발생시킬 수 있으며 워크플로 실행 중에 발생할 수 있는 몇 가지 조건이 있습니다. 예를 들어, 호스트 응용 프로그램은 WorkflowInstance 개체에서 Abort 메서드를 호출하여 프로세스에 개입할 수 있습니다 이 경우 이유가 알려져 있으며 이유를 처리하는 논리를 호스트 응용 프로그램 자체에서 쉽게 만들 수 있습니다.

그러나 Windows Workflow Foundation 런타임 엔진에서 워크플로를 중단하는 조건이 있습니다. 이러한 조건의 예는 런타임 엔진에서 워크플로 인스턴스를 종료하지 못하는 경우입니다. 이 조건과 관련된 일반적인 시나리오는 SqlWorkflowPersistenceService와 관련이 있습니다. 워크플로 런타임 엔진에서 워크플로를 종료해야 하고 SqlWorkflowPersistenceService가 활성 상태이면 런타임 엔진에서 워크플로 상태를 유지하려고 합니다. 그러나 SqlException이 지속 작업 중에 throw되면 런타임 엔진에서 워크플로 인스턴스를 중단해야 합니다. 이 경우 런타임 엔진에서 워크플로 인스턴스를 중단하도록 한 시나리오를 디버깅하기 위해 TrackingService를 사용하여 예외 정보를 덤프할 수 있습니다.

워크플로를 종료한 위치 확인

WorkflowTerminated 이벤트는 호스트 응용 프로그램을 통해 프로그래밍 방식으로나 워크플로에서 TerminateActivity를 사용하여 발생시키거나 catch되지 않은 예외로 인해 발생할 수 있습니다. 호스트 응용 프로그램에서 워크플로가 종료되도록 한 작업 유형에 따라 특정 논리를 수행해야 하는 경우 확인해야 할 몇 가지 주요 논리 부분이 있습니다. 다음 표에는 워크플로의 다양한 상태와 종료의 이유와 관련된 정보를 찾을 위치가 나와 있습니다.

작업 워크플로 상태 활동 실행 상태 종료 또는 일시 중단 정보

일반 실행

Completed

Closed

NULL

TerminateActivity(이유가 지정되며 NULL이 아님)

Terminated

Executing

이유가 워크플로 디자인에 지정됨

TerminateActivity(이유가 NULL임)

Terminated

Executing

Workflow Terminated 형식의 예외가 thrown됨

호스트 응용 프로그램에서 종료됨

Terminated

Executing

이유가 Terminate 메서드 매개 변수에 지정됨

처리되지 않은 예외

Terminated

Closed

종료의 원인인 예외의 메시지

오류 핸들러의 처리되지 않은 예외

Terminated

Closed

종료의 원인인 예외의 메시지

워크플로에서 예외가 throw된 위치는 워크플로 그래프를 탐색하고 종료될 때의 각 활동에 대한 상태를 확인하여 찾을 수 있습니다. 다음 코드 예제에서는 예외가 FaultHandlerActivity에서 throw되는 경우 이 작업을 수행하는 방법을 보여 줍니다.

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.