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

工作流程式設計漸進指南(四):InvokeWorkflowActivity 異步啟動子工作流

     編輯:關於C#

一、InvokeWorkflowActivity 簡介

從一個工作流異步啟動另一個工作流。啟動後立即完成,不等待子工作流結束。

重要限制

  • 不支援遞迴工作流(A→B 則 B 不能啟動 A 或間接啟動 A 的工作流)。
  • 需使用排程器服務建立新工作流實例。
  • 僅支援輸入參數,不支援取得輸出參數(異步特性)。
  • 工作流間通訊遵循標準規則。

使用步驟

  1. 拖入 InvokeWorkflowActivity 到設計器。
  2. 設定 TargetWorkflow 為目標工作流類型。
  3. 設定目標工作流所需參數值。

Invoking 事件

建立子工作流實例前觸發,可完成初始化設定。

二、建立主工作流專案

  1. VS2008 新增控制台狀態機工作流,命名 InvokeWorkflowActivityDemo。
  2. 設計四個 State,前兩個加 StateInitialization,第三個加 EventDriven,建立轉換。
  3. 主工作流架構

三、新增子狀態機工作流

  1. 專案右鍵→新增→State Machine Workflow,命名 SubWF。
  2. 新增子工作流 命名 SubWF 子工作流設計器
  • 子工作流放入 StateInitialization 與 StateFinalization,設定終態。
  • 子工作流活動
  • 雙擊 StateInitialization 建立簡單活動流程。
  • 子工作流內部活動
  • Code 活動程式碼:
  • private void codeActivity1_ExecuteCode(object sender, EventArgs e)
    {
        Console.WriteLine("這是發自子狀態機中的消息。");
    }

    四、主工作流調用子工作流

    在 State1 的 StateInitialization 中放入 InvokeWorkflowActivity,設定 TargetWorkflow 為 SubWF。

    InvokeWorkflowActivity 設定 TargetWorkflow 選擇對話框

    五、加入 HandleExternalEventActivity 等待完成

    在 State2 的 EventDriven 中放入 HandleExternalEventActivity,等待本地服務事件通知子工作流完成。

    HandleExternalEventActivity

    設定 InterfaceType 為自訂介面,EventName 為 InvokedWorkflowComplete。

    介面類型選擇

    六、定義本地服務介面與實作

    介面

    [ExternalDataExchange]
    internal interface ILocalService
    {
        event EventHandler<ExternalDataEventArgs> InvokedWorkflowComplete;
        void WorkComplete(Guid HostWFGuid);
    }

    實作類別

    internal class LocalService : ILocalService
    {
        public event EventHandler<ExternalDataEventArgs> InvokedWorkflowComplete;
        
        public void WorkComplete(Guid HostWFGuid)
        {
            if (InvokedWorkflowComplete != null)
                InvokedWorkflowComplete(null, new ExternalDataEventArgs(HostWFGuid));
        }
    }

    七、宿主程式整合

    using System;
    using System.Threading;
    using System.Workflow.Runtime;
    using System.Workflow.Runtime.Hosting;
    using System.Workflow.Activities;
    
    namespace InvokeWorkflowActivityDemo
    {
        class Program
        {
            static Guid HostWFGuid;
            static LocalService ls;
            
            static void Main(string[] args)
            {
                using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())
                {
                    // 載入本地服務
                    ExternalDataExchangeService dataService = new ExternalDataExchangeService();
                    workflowRuntime.AddService(dataService);
                    
                    ls = new LocalService();
                    dataService.AddService(ls);
                    
                    AutoResetEvent waitHandle = new AutoResetEvent(false);
                    
                    workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e)
                    {
                        if (e.WorkflowInstance.InstanceId != HostWFGuid)
                        {
                            // 子工作流完成,通知主工作流
                            ls.WorkComplete(HostWFGuid);
                        }
                        else
                        {
                            // 主工作流完成
                            waitHandle.Set();
                        }
                    };
                    
                    workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
                    {
                        Console.WriteLine(e.Exception.Message);
                        waitHandle.Set();
                    };
                    
                    WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(Workflow1));
                    HostWFGuid = instance.InstanceId;
                    instance.Start();
                    waitHandle.WaitOne();
                    Console.ReadLine();
                }
            }
        }
    }

    八、執行結果

    執行畫面

    出處

    https://zhuxianzhong.blog.51cto.com/157061/203672

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