处理 WorkflowRuntime 事件

Windows 工作流运行时引擎在其整个生存期中引发主机应用程序可以处理的多个事件。这些事件包括当运行时引擎 StartedStopped 时通知应用程序,以及与任何正在运行的工作流实例的生存期相对应的多个事件。为这些事件创建事件处理程序的过程与 .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 工作流运行时引擎引发、与工作流运行时引擎自身相关的事件。

事件 说明

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,则运行时引擎将必须中止该工作流实例。如果发生这种情况,则可以使用 TrackingService 来转储异常信息,以便对导致运行时引擎中止工作流实例的方案进行调试。

确定工作流终止源

WorkflowTerminated 事件的引发方式有两种:通过主机应用程序以编程方式引发,方法是在工作流中使用 TerminateActivity 进行引发;如果未捕获到异常,也会引发此事件。如果主机应用程序需要执行基于操作类型的可能导致工作流终止的特定逻辑,则需要检查几个关键逻辑部分。下表显示一个工作流的各种状态以及在何处查找有关终止原因的信息。

操作 工作流状态 活动执行状态 终止或挂起信息

正常执行

已完成

已关闭

NULL

TerminateActivity(原因已指定并且不为 NULL)

已终止

正在执行

在工作流设计时指定原因

TerminateActivity(原因为 NULL)

Terminated

正在执行

引发了“工作流已终止”类型的异常

从主机应用程序终止

Terminated

正在执行

在 Terminate 方法参数中指定原因

未处理的异常

Terminated

已关闭

导致终止的异常的消息

错误处理程序中未处理的异常

Terminated

已关闭

导致终止的异常的消息

可以通过浏览工作流图和检查终止时各个活动的状态来找到工作流中引发异常的位置。下面的代码演示在 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

版权所有 (C) 2007 Microsoft Corporation。保留所有权利。