Workflow 4.0 中三种方式实现workflow的触发调用

1WorkflowInvoker

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

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

 

2、WorkflowApplication

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

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

 

3、WorkflowServiceHost

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

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

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

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

<span style="font-size:18px;">namespace workflow
{

    public sealed class AddActivity : CodeActivity
    {
        AutoResetEvent instanceUnloaded = new AutoResetEvent(false);
        // 定义输入参数
        public InArgument<int> number1 { get; set; }
        public InArgument<int> number2 { get; set; }

        //定义输出参数
        public OutArgument<int> sum {get;set; }

        // 如果活动返回值,则从 CodeActivity<TResult>
        // 派生并从 Execute 方法返回该值。
        protected override void Execute(CodeActivityContext context)
        {
            // 获取 Text 输入参数的运行时值
            int number1 = context.GetValue(this.number1);
            int number2 = context.GetValue(this.number2);

            //更新输出参数
            context.SetValue(sum, number2 + number1);
        }
    }
}</span>

<span style="font-size:18px;">namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            AutoResetEvent instanceUnloaded = new AutoResetEvent(false);
            Activity activity = new AddActivity();//实例化一个流程

            WorkflowApplication application = new WorkflowApplication(
                                        activity,               
                                        new Dictionary<string, object>(){
                                                {"number1", 12}, //参数名
                                                {"number2", 12}, //参数名
                                            });
            #region 回调函数
            application.Completed = (workflowApplicationCompletedEventArgs) =>
            {
                Console.WriteLine("\nWorkflowApplication has Completed in the {0} state.", workflowApplicationCompletedEventArgs.CompletionState);
            };
            application.PersistableIdle = (e) =>
            {
                return PersistableIdleAction.Unload;
            };

            application.Unloaded = (workflowApplicationEventArgs) =>
            {
                instanceUnloaded.Set();
                Console.WriteLine("WorkflowApplication has Unloaded\n");
            };
            application.OnUnhandledException = (ex) =>
            {
                Console.Write("Exception");
                return UnhandledExceptionAction.Terminate;
            };
            #endregion

            application.Run();    //流程触发启动

            //线程等待
            instanceUnloaded.WaitOne();
            Console.WriteLine("输出结束");
            Console.Read();
        }
    }
}</span>

第三种方法没有用到,还有待研究。。。




评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值