工作流编程循序渐进(4:InvokeWorkflowActivity活动)
2010-09-30 20:57:15 来源:WEB开发网[一]定义接口
根据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运行控制台程序,一般顺利的话,将得到如下图所示运行时快照。
图片看不清楚?请点击这里查看原图(大图)。
出处: http://zhuxianzhong.blog.51cto.com/157061/203672
更多精彩
赞助商链接