zoukankan      html  css  js  c++  java
  • Workflow 4.0 中三种方式实现workflow的触发调用

    1:使用WorkflowInvoker类中的InVoke静态方法-->WorkflowInvoker.Invoke(myWF);   //myWF为自定义的workflow实例

      【这种方式可以像一个函数一样顺序执行我们的工作流程,非常简单,但是在工作流执行过程中,不能与工作流实现数据的交换】

    2:调用WorkflowApplication实例的Run方法-->WorkflowApplication wfApp = new WorkflowApplication(myWF); wfApp.Run();   //myWF为自定义的workflow实例

      【可以控制工作流实例长时间运行,可以在运行过程中和实例进行数据交换。但是只能执行一个的工作流实例。

    3:使用WorkflowServiceHost类host起来一个服务,然后在客户端声明一个ServiceClient类的实例,用这个实例通过WCF与之前host起来的服务进行通信完成workflow的触发调用。

      【WorkflowServiceHost是一个最主要的工作流主机类。可以同时管理多个工作流实例,同时控制实例的激活等操作。

        支持WCF,和3.5相比有更强大的消息关联功能。当然WorkflowServiceHost也支持持久化(Persistence)和跟踪(Tracking)等功能。

    第一、二种实现方式非常简单,这里简单的用一个实例说明即可,如下所示:

    -->在一个名为MyWorkflowActivities001的工程中(命名空间:MyWorkflowActivities001) 定义实现一个Activity(向c盘中的文件中写入一定内容:时间 + 当前线程id):

    namespace MyWorkflowActivities001
    {
        public class Log : CodeActivity
        {
            protected override void Execute(CodeActivityContext context)
            {
                try
                { 
                    using(StreamWriter writer = new StreamWriter(@"C:\\Log\mylog.txt", true))
                    {
                        writer.WriteLine(DateTime.Now.ToString() + " -- " + Thread.CurrentThread.ManagedThreadId.ToString());
                    }
                }
                catch (Exception ex)
                { }
            }
        }
    }

    --> 让后将其放入一个.xaml的可视化的workflow(定义其命名空间和类名为MyWorkflowActivities001.MyWorkflow)(显示名:WriteLog) 的sequence中

    -->再添加另外一个名叫MyWorkflowService001的工程(命名空间:MyWorkflowService001)引入刚才的MyWorkflowActivities001工程,然后添加如下代码

    namespace MyWorkflowService001
    {
        class Program
        {
            static void Main(string[] args)
            {
                try
                {
                    MyWorkflow myWF = new MyWorkflow();
                    WorkflowInvoker.Invoke(myWF);
    
                    //WorkflowApplication wfApp = new WorkflowApplication(myWF);
                    //wfApp.Run();
    
                    Console.ReadLine();
                }
                catch (Exception ex)
                { }
            }
        }
    }

    ***上面实现了第一和第二种方式的调用。***

    第三种方式请看如下所示:将MyWorkflowService001的内容改动一下

    namespace MyWorkflowService001
    {
        class Program
        {
            static void Main(string[] args)
            {
                try
                {
                    MyWorkflow myWF = new MyWorkflow();
    
                    WorkflowServiceHost host = new WorkflowServiceHost(myWF, new Uri("http://localhost:18888/hostwfservice"));
    
                    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                    smb.HttpGetEnabled = true;
                    host.Description.Behaviors.Add(smb);
    
                    host.Open();
    
                    Console.WriteLine("OK");
                    Console.ReadLine();
                }
                catch (Exception ex)
                { }
            }
        }
    }

    -->这样用 http://localhost:18888/hostwfservice 这个url来Host我们的服务, 为了能够用ServiceClient方式call到此服务,我们还需修改一下WriteLog的.xaml的可视化workflow模型,在调用Log这个activity之前,添加一个ReceiveAndSendReply组件(这个组件可以进行接收外部传递来的消息,并使workflow继续执行),这个组件中有个属性叫:OperationName-->这是一个方法名(即:调起此Workflow的方法名!!!)假设我们修改成为:StartWorkflow,那么我们的ServiceClient实例就可以用StartWorkflow这个方法调起workflow了。而且通过设置其Receive中的content属性可以设置传递进来的参数,设置SendReplyToReceive中的content属性可以设置返回的参数值,修改如下图所示:

    -->然后我们创建另外一个工程ConsoleApplication1,添加一个Service Reference(http://localhost:18888/hostwfservice)【注:添加服务引用的时候要把http://localhost:18888/hostwfservice 这个service 运行起来】,之后添加如下代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using ConsoleApplication1.ServiceReference1;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                try
                {
                    ServiceClient client = new ServiceClient();
                    bool result = client.StartWorlkflow("haha");
                }
                catch (Exception ex)
                { }
            }
        }
    }

    -->这里我们就用修改好的那个OperationName所对应的StartWorkflow方法调起相应的workflow了(而且给workflow 传递了一个string,Receive中添加的Content 属性值可以接收 --> 定义了对应的Parameter的Name(即StartWorkflow方法的参数,ConsoleApplication1工程需要重新Reload一下对应此的Service)和Assign To(可以用一个workflow的局部变量接收)之后的InArgument和OutArgument就变得容易多了)

    至此三种调用启动workflow的方式处理完了,若有纰漏,请指正。

  • 相关阅读:
    混合开发的坑(3) ---关于es6
    混合开发的坑(2) ---pdf展示
    混合开发的坑(1) ---ajax请求
    vue.js
    vue中 import引入组件
    vue中 静态文件引用注意事项
    Oracle 数据库链接
    Oracle中的NVL,NVL2,NULLIF以及COALESCE函数使用
    Merge into 使用
    C# —— IList, ArrayList与List的区别详解
  • 原文地址:https://www.cnblogs.com/mingmingruyuedlut/p/2549613.html
Copyright © 2011-2022 走看看