【翻译】WF从入门到精通(第二章):workflow运行时 笔记

  1. WorkflowRuntime

表2-1 WorkflowRuntime的属性

属性 功能
IsStarted 用来指明workflow运行时是否已经启动并准备接受workflow实例。当宿主调用“StartRuntime”前IsStarted为False。期间它一直维持True直到宿主调用“StopRuntime”为止。需注意的是当它正在运行中你不能增加核心服务。
Name      获取或设置和WorkflowRuntime关联的名字。Workflow运行时正在运行中你不能设置这个属性(也就是说当IsStarted为True)。企图这样做的结果就是抛出一个“InvalidOperationException”异常。

表2-2 WorkflowRuntime的方法

方法 功能
AddService 为workflow运行时添加指定的服务。能添加的服务类型和时间受到种种限制。关于服务的详细信息将在第五章介绍。
CreateWorkflow 创建一个workflow实例,它包含一些指定(但可选)的参数。假如workflow运行时没有启动,该方法就调用StartRuntime方法。
GetWorkflow 通过 指明workflow实例的标识符(由一个Guid组成)来检索workflow实例。假如这个workflow实例是空闲和持久化保存的,它将被重新加载并执行。
StartRuntime 启动workflow运行时和相关服务,并引发“Started”事件。
StopRuntime 停止workflow运行时和相关服务,并引发“Stoped”事件。

    

表2-2 WorkflowRuntime的事件

事件 功能
Started 当workflow运行时启动后激发。
Stopped 当workflow运行时停止后激发。
WorkflowCompleted 当一个workflow实例完成后激发。
WorkflowIdled 当一个workflow实例进入空闲状态时激发。当workflow实例进入了空闲状态后,你就有机会把他们从内存中卸载掉、存储到数据库并可在稍后的时间把它们加载进内存。
WorkflowTerminated 当一个workflow实例被终止后激发。在宿主中调用一个workflow实例的Terminate方法、或通过一个Terminate活动、或当workflow运行时产生一个未经捕获的异常时都会终止该workflow

 2. WorkflowFactory.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Workflow.Runtime;

namespace WorkflowHost
{
    
public static class WorkflowFactory
    
{
        
//workflow runtime的单一实例
        private static WorkflowRuntime _workflowRuntime = null;
        
private static object _syncRoot = new object();
        
//工厂方法
        public static WorkflowRuntime GetWorkflowRuntime()
        
{
            
//多线程环境下防止并发访问
            lock (_syncRoot)
            
{
                
if (null == _workflowRuntime)
                
{
                    AppDomain.CurrentDomain.ProcessExit 
+= new EventHandler(StopWorkflowRuntime);
                    AppDomain.CurrentDomain.DomainUnload 
+= new EventHandler(StopWorkflowRuntime);
                    _workflowRuntime 
= new WorkflowRuntime();
                    _workflowRuntime.StartRuntime();
                }

            }

            
return _workflowRuntime;
        }

        
static void StopWorkflowRuntime(object sender, EventArgs e)
        
{
            
if (_workflowRuntime != null)
            
{
                
if (_workflowRuntime.IsStarted)
                
{
                    
try
                    
{
                        _workflowRuntime.StopRuntime();
                    }

                    
catch (ObjectDisposedException)
                    
{
                    }

                }

            }

        }

    }

}

posted @ 2010-01-21 15:49  Ken-Cai  阅读(173)  评论(0编辑  收藏  举报