WEB开发网
开发学院软件开发C语言 工作流编程循序渐进(4:InvokeWorkflowActivity活... 阅读

工作流编程循序渐进(4:InvokeWorkflowActivity活动)

 2010-09-30 20:57:15 来源:WEB开发网   
核心提示: [一]定义接口根据WWF中本地服务的定义要求,首先要定义一个修饰以ExternalDataExchange属性的接口,工作流编程循序渐进(4:InvokeWorkflowActivity活动)(6),我们对之命名为ILocalService,代码如下:[ExternalDataExchange]

[一]定义接口

根据WWF中本地服务的定义要求,首先要定义一个修饰以ExternalDataExchange属性的接口,我们对之命名为ILocalService,代码如下:

[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));
        }
    }
}

上面定义中,基本遵循了“死”格式,除了方法名称外。在本文中先不详细讨论。

七、在宿主中操作工作流实例与本地服务

根据前面的要求,本地服务负责工作流实例与宿主间的通信中介,而加载本地服务的工作是在宿主中完成的。下面给出了宿主部分(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;

using System.Workflow.Activities;//ExternalDataExehangeService
namespace InvokeWorkflowActivityDemo
{
    class Program
    {
        static Guid HostWFGuid;//用于记忆父工作流实例的ID标记
        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;//记下父工作流实例的ID标记
                instance.Start();
                waitHandle.WaitOne();//阻止当前线程,直到当前waitHandle收到信号。
                Console.ReadLine();
            }
        }
    }
}

根据MSDN声明,启动工作流的实例之前,必须将 ExternalDataExchangeService 添加到工作流运行时引擎,然后将自定义通信服务添加到 ExternalDataExchangeService。详情请参考MSDN文章《在工作流中使用本地服务》。

八、运行实例

按F5运行控制台程序,一般顺利的话,将得到如下图所示运行时快照。

工作流编程循序渐进(4:InvokeWorkflowActivity活动)

图片看不清楚?请点击这里查看原图(大图)。

出处: http://zhuxianzhong.blog.51cto.com/157061/203672

上一页  1 2 3 4 5 6 

Tags:工作流 编程 循序渐进

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接