首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WF 從入門到精通(第二章):WorkflowRuntime 核心機制與事件模型

     編輯:關於.NET

學習目標

  • 在應用程式中正確使用工作流
  • 理解 WorkflowRuntime 物件核心功能
  • 掌握啟動與停止工作流運行時的方法
  • 熟練使用各類工作流運行時事件

WorkflowRuntime 架構角色

WF 環境中執行任務需由 WorkflowRuntime 物件監管。它啟動獨立工作流任務,響應執行過程中的各類事件,並可添加額外服務(如追蹤)。

WF 架構縱覽

關鍵架構特性

  • WF 與宿主應用程式並行執行,宿主可為 WinForms、Console、ASP.NET、Windows Service
  • 同一 .NET 應用程式域僅能存在一個 WorkflowRuntime 實例,嘗試創建第二個會拋出 InvalidOperationException
  • 工作流應用程式 = 邏輯上的一組活動;宿主運行時操作活動並讓運行時執行,產生工作流實例

在宿主應用程式中添加 WF

建立 WorkflowRuntime 工廠模式

結合單例與工廠模式,確保應用程式域內唯一 WorkflowRuntime 實例,支援多模組加載。

public static class WorkflowFactory
{
    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 && _workflowRuntime.IsStarted)
        {
            try { _workflowRuntime.StopRuntime(); }
            catch (ObjectDisposedException) { }
        }
    }
}

WorkflowRuntime 核心屬性與方法

表 2-1:屬性

屬性功能
IsStarted指示運行時是否已啟動並就緒。StartRuntime 前為 False,StopRuntime 前保持 True。運行中不可添加核心服務
Name獲取/設定關聯名稱。運行中不可設定

表 2-2:常用方法

方法功能
AddService添加指定服務(類型與時間受限,第 5 章詳述)
CreateWorkflow創建工作流實例(含可選參數)。若運行時未啟動則自動調用 StartRuntime
GetWorkflow透過 Guid 識別碼檢索實例。閒置持久化實例將重新載入執行
StartRuntime啟動運行時與相關服務,引發 Started 事件
StopRuntime停止運行時與服務,引發 Stopped 事件

啟動與停止運行時

工廠方法中自動調用 StartRuntime。停止邏輯註冊於 AppDomain.ProcessExit 與 DomainUnload 事件,確保應用程式域關閉前正確釋放資源。

WorkflowRuntime 事件模型

表 2-3:核心事件

事件觸發時機
Started運行時啟動後
Stopped運行時停止後
WorkflowCompleted工作流實例完成後
WorkflowIdled實例進入閒置狀態。可借機卸載、持久化至資料庫,稍後重載
WorkflowTerminated實例被終止(宿主調用 Terminate、Terminate 活動、未捕獲異常)

事件處理實作範例

private static AutoResetEvent waitHandle = new AutoResetEvent(false);

static void Main(string[] args)
{
    WorkflowRuntime workflowRuntime = WorkflowFactory.GetWorkflowRuntime();
    workflowRuntime.WorkflowIdled += workflowRuntime_WorkflowIdled;
    workflowRuntime.WorkflowCompleted += workflowRuntime_WorkflowCompleted;
    workflowRuntime.WorkflowTerminated += workflowRuntime_WorkflowTerminated;
    
    Console.WriteLine("等待 workflow 完成。");
    waitHandle.WaitOne();
    Console.WriteLine("完成.");
}

static void workflowRuntime_WorkflowIdled(object sender, WorkflowEventArgs e)
{
    Console.WriteLine("workflow 實例閒置中");
}

static void workflowRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e)
{
    Console.WriteLine("workflow 實例已完成");
    waitHandle.Set();
}

static void workflowRuntime_WorkflowTerminated(object sender, WorkflowTerminatedEventArgs e)
{
    Console.WriteLine("workflow 實例已終止, 原因: '{0}'。", e.Exception.Message);
    waitHandle.Set();
}

專案參考設定

下一章將深入工作流實例。若當前直接執行此程式會無限等待,因尚未啟動任何工作流實例,事件永不觸發。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved