Windows Workflow Foundation(3)- WorkflowRuntime及其相关事件

工作流分类

工作流分为顺序工作流(Sequential)和状态机工作流(State Machine)。顺序工作流是以顺序驱动并按顺序执行一组包含的活动。您可以向顺序工作流添加单个活动,也可以添加其他复合活动以实现并行(ParallelActivity)、事件驱动并行活动(EventHandlingScopeActivity)、数据驱动执行 (ConditionedActivityGroup)、事件驱动分支 (ListenActivity) 和熟悉的强制性控制流模式,如条件分支 (IfElseActivity) 和迭代(WhileActivityReplicatorActivity),还可以添加自定义复合活动,用这些活动实现您的解决方案需要的特定控制流模式。

下面的流程图显示一个顺序工作流的示例。


顺序工作流按顺序方式执行活动,直到最后一个活动完成。即使在正常操作下,顺序工作流也不必是完全确定的。例如,您可以使用 ListenActivity 活动或 ParallelActivity 活动,在这两种情况下事件的准确顺序可以不同。状态机工作流是以事件驱动的活动,工作流本身由一组状态组成。将一个状态指示为初始状态。每个状态都可以接收一组特定事件。视事件而定,可以转换到另一个状态。状态机工作流可以有最终状态。当对最终状态进行转换时,工作流将完成。

下面的流程图是一个状态机工作流的示例。


下表列出了 Windows Workflow Foundation 基本活动库中状态机相关的活动。

活动

说明

EventDrivenActivity

用于依赖于外部事件开始执行的状态。EventDrivenActivity 活动必须具有实现 IEventActivity 接口作为第一个子活动的活动。

SetStateActivity

指定到新状态的转换。

StateActivity

表示状态机中的一个状态;可能包含其他 State 活动。有关更多信息。

StateInitializationActivity

在进入某个状态时执行;可能包含其他活动。有关更多信息

StateFinalizationActivity

在离开 StateActivity 活动时执行包含的活动。有关更多信息

WorkflowRuntime

当我们在WF环境中执行任务时,需要一些东西来监管执行的过程,这个东西就是命名为“WorkflowRuntime”的对象。 WorkflowRuntime 启动一个独立的工作流任务。在我们的任务执行过程中,WorkflowRuntime 也会针对不同的情况响应对应的事件。并 且,WorkflowRuntime还能在你的执行环境中增加一个附加的服务来保持跟踪。

WF 架构纵览见下图:


WF 和我们的应用程序并行执行。其实,我们需要应用程序作为宿主。宿主应用程序可以是Windows Forms 应用程序,控制台应用程序,ASP.NET WEB 应用程序,甚至可以是一个Windows ServerWF 运行时和我们的应用程序同在一个.NET 应用程序域执行,每个应用程序域只有一个唯一的WorkflowRuntime 实例,试图在一个 应用程序域中建立第二个WorkflowRuntime 的实例的话,其结果就是抛出一个“InvalidOperationException”异常。

workflow 应用程序-workflows-意思指创建的逻辑上的一组活动。这些逻辑上的活动用来完成你需要的工作流任务。当你宿主workflow 运行时的时候,其实我们就在操作工作流中的活动并让workflow 运行时执行他们。其结果就是生成一个workflow 实例,workflow实例是一个当前正执行 workflow 任务,它能自己完成逻辑上的一组活动。

WorkflowRuntime相关事件

事件

功能

Started

当workflow 运行时启动后激发。

Stopped

当workflow 运行时停止后激发。

WorkflowCompleted

当一个workflow 实例完成后激发。

WorkflowIdled

当一个workflow 实例进入空闲状态时激发。当workflow 实例进入了空闲状态后,你就有机会把他们从内存中卸载掉、存储到数据库并可在稍后的时间把它们加载进内存。

WorkflowTerminated

当一个workflow 实例被终止后激发。在宿主中调用一个workflow 实例的Terminate 方法、或通过一个Terminate 活动、或当workflow 运行时产生一个未经捕获的异常时都会终止该workflow。

为了更直观的理解各种事件的执行状况,我们用应用程序来展示。我们在第一章的工程里面的workflow里添加一个的Delay活动和一个WorkflowFactory.cs文件。



WorkflowFactory.cs文件代码

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Workflow.Runtime;

 

namespace WorkflowConsoleApplication1

{

      class WorkflowFactory

      {

        // Singleton instance of the workflow runtime

        private static WorkflowRuntime _workflowRuntime = null;

 

        // Lock (sync) object

        private static object _syncRoot = new object();

 

        // Factory method

        public static WorkflowRuntime GetWorkflowRuntime()

        {

            // Lock execution thread in case of multi-threaded

            // (concurrent) access.

            lock (_syncRoot)

            {

                // Check for startup condition

                if (null == _workflowRuntime)

                {

                    // Provide for shutdown

                    AppDomain.CurrentDomain.ProcessExit += new EventHandler(StopWorkflowRuntime);

                    AppDomain.CurrentDomain.DomainUnload += new EventHandler(StopWorkflowRuntime);

                    // Not started, so create instance

                    _workflowRuntime = new WorkflowRuntime();

                    // Start the runtime

                    _workflowRuntime.StartRuntime();

                } // if

                // Return singleton instance

                return _workflowRuntime;

            } // lock

        }

        // Shutdown method

        static void StopWorkflowRuntime(object sender, EventArgs e)

        {

            if (_workflowRuntime != null)

            {

                if (_workflowRuntime.IsStarted)

                {

                    try

                    {

                        // Stop the runtime

                        _workflowRuntime.StopRuntime();

                    }

                    catch (ObjectDisposedException)

                    {

                        // Already disposed of, so ignore...

                    } // catch

                } // if

            } // if

        }

 

      }

}

Program.cs 文件代码

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

using System.Workflow.Runtime;

using System.Workflow.Runtime.Hosting;

 

namespace WorkflowConsoleApplication1

{

    class Program

    {

        private static AutoResetEvent waitHandle = new AutoResetEvent(false);

        static void Main(string[] args)

        {

            //实例化WorkflowRuntime即工作流引擎

           WorkflowRuntime workflowRuntime = WorkflowFactory.GetWorkflowRuntime();

 

 

                //工作流空闲

                workflowRuntime .WorkflowIdled +=new EventHandler<WorkflowEventArgs>(workflowRuntime_WorkflowIdled);

                //完成工作流

                workflowRuntime.WorkflowCompleted +=new EventHandler<WorkflowCompletedEventArgs>(workflowRuntime_WorkflowCompleted);

               //中断工作流

                workflowRuntime.WorkflowTerminated +=new EventHandler<WorkflowTerminatedEventArgs>(workflowRuntime_WorkflowTerminated);

 

                //工作流实例化

                WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WorkflowConsoleApplication1.Workflow1));

 

                Console.WriteLine("Waiting for workflow completion.");

 

                //启动工作流

                instance.Start();

 

                waitHandle.WaitOne();

 

                Console.WriteLine("Done.");

                System.Threading.Thread.Sleep(10000);

        }

 

        static void workflowRuntime_WorkflowTerminated(object sender, WorkflowTerminatedEventArgs e)

        {

            Console.WriteLine("Workflow instance terminated, reason: '{0}'.", e.Exception.Message);

            waitHandle.Set();

        }

 

        static void workflowRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e)

        {

            Console.WriteLine("Workflow instance completed.");

            waitHandle.Set();

        }

 

        static void workflowRuntime_WorkflowIdled(object sender, WorkflowEventArgs e)

        {

            Console.WriteLine("Workflow instance idled.");

        }

 

    }

}

转载于:https://www.cnblogs.com/chkff_01/archive/2008/12/24/1361512.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值