ManualWorkflowSchedulerService手动调度服务.doc_第1页
ManualWorkflowSchedulerService手动调度服务.doc_第2页
ManualWorkflowSchedulerService手动调度服务.doc_第3页
ManualWorkflowSchedulerService手动调度服务.doc_第4页
ManualWorkflowSchedulerService手动调度服务.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 ManualWorkflowSchedulerService 手动调度服务当该服务加载到引擎中后,有如下特点:1. 如果实例正在运行,宿主的当前进程将被阻塞,直到工作流实例进入idle状态,引擎对宿主的阻塞才结束2. 对实例的操作,如启动(Start)、触发外部事件(handleExternalEventActivity)等操作,只以手动调用ManualWorkflowSchedulerService 服务的RunWorkflow(实例ID)方法,才会真正执行3. 只有调用ManualWorkflowSchedulerService 服务的RunWorkflow(实例ID)方法时,流程才运行,宿主才被阻塞4. 当实例进入idle状态时组塞才结束5. 可以依次调用完所用的触发外部事件(handleExternalEventActivity),再调用ManualWorkflowSchedulerService 服务的RunWorkflow(实例ID)方法开始执行ManualWorkflowSchedulerService mws;WorkflowRuntime runtime;runtime = new WorkflowRuntime();mws = new ManualWorkflowSchedulerService();runtime.AddService(mws);WorkflowInstance instance = runtime.CreateWorkflow(typeof(Workflow1);Guid instanceId;instanceId = instance.InstanceId;instance.Start(); /此时,实例并没开始mws.RunWorkflow(instanceId); /实例开始2 与正常的工作流对比说明2.1 外部事件using System;using System.Collections.Generic;using System.Text;using System.Workflow.Activities;namespace wxwinter.wf.TestWorkflow ExternalDataExchange public interface IEXService event EventHandler one; event EventHandler tow; event EventHandler three; Serializable public class ExService : IEXService public event EventHandler one; public event EventHandler tow; public event EventHandler three; public void Rone(Guid instanceId) if (this.one != null) this.one(this, new ExtEventArgs(instanceId); public void Rtow(Guid instanceId) if (this.tow != null) this.tow(this, new ExtEventArgs(instanceId); public void Rthree(Guid instanceId) if (this.three != null) this.three(this, new ExtEventArgs(instanceId); Serializable public class ExtEventArgs : ExternalDataEventArgs public ExtEventArgs(Guid instanceId) : base(instanceId) 2.2 工作流2.3 工作流结点代码using System;using System.ComponentModel;using System.ComponentModel.Design;using System.Collections;using System.Drawing;using System.Workflow.ComponentModel.Compiler;using System.Workflow.ComponentModel.Serialization;using System.Workflow.ComponentModel;using System.Workflow.ComponentModel.Design;using System.Workflow.Runtime;using System.Workflow.Activities;using System.Workflow.Activities.Rules;namespace wxwinter.wf.TestWorkflowpublic sealed partial class Workflow1: SequentialWorkflowActivitypublic Workflow1()InitializeComponent(); private void codeActivity1_ExecuteCode(object sender, EventArgs e) System.Console.WriteLine(开始 + DateTime.Now.ToString(); private void codeActivity2_ExecuteCode(object sender, EventArgs e) System.Console.WriteLine(One(随后sleep 20M) + DateTime.Now.ToString(); System.Threading.Thread.Sleep(20000); private void codeActivity3_ExecuteCode(object sender, EventArgs e) System.Console.WriteLine(two + DateTime.Now.ToString(); private void codeActivity4_ExecuteCode(object sender, EventArgs e) System.Console.WriteLine(three + DateTime.Now.ToString(); 2.4 宿主代码 Guid instanceId; WorkflowRuntime runtime; ExService exchangeServer; ManualWorkflowSchedulerService mws; /正常启动引擎 private void button1_Click(object sender, EventArgs e) runtime = new WorkflowRuntime(); ExternalDataExchangeService exchange = new ExternalDataExchangeService(); runtime.AddService(exchange); exchangeServer = new ExService(); exchange.AddService(exchangeServer); runtime.StartRuntime(); WorkflowInstance instance = runtime.CreateWorkflow(typeof(Workflow1); instanceId = instance.InstanceId; instance.Start(); /ManualWorkflowSchedulerService方式启动引擎 private void button5_Click(object sender, EventArgs e) runtime = new WorkflowRuntime(); ExternalDataExchangeService exchange = new ExternalDataExchangeService(); runtime.AddService(exchange); mws = new ManualWorkflowSchedulerService(); runtime.AddService(mws); exchangeServer = new ExService(); exchange.AddService(exchangeServer); runtime.StartRuntime(); WorkflowInstance instance = runtime.CreateWorkflow(typeof(Workflow1); instanceId = instance.InstanceId; instance.Start(); /one private void button2_Click(object sender, EventArgs e) exchangeServer.Rone(instanceId); /tow private void button3_Click(object sender, EventArgs e) exchangeServer.Rtow(instanceId); /three private void button4_Click(object sender, EventArgs e) exchangeServer.Rthree(instanceId); /ManualWorkflowSchedulerService的RunWorkflow private void button6_Click(object sender, EventArgs e) mws.RunWorkflow(instanceId); 2.5 正常使用开始-09-12 14:33:35One(随后sleep 20M)2007-09-12 14:33:38two2007-09-12 14:34:05three2007-09-12 14:34:141. 启动,开运行 codeActivity1的代码,显示开始-09-12 14:33:35,然后进入one的idel2. 触发one,并运行codeActivity2的代码,,显示One(随后sleep 20M)2007-09-12 14:33:38,Sleep 20秒后,进入two的idel3. 触发two,并运行codeActivity3的代码,,显示two2007-09-12 14:34:05,进入three的idel4. 触发three,并运行codeActivity4的代码,,显示three2007-09-12 14:34:14,进入three的idel注意:A. 当执行codeActivity2的Sleep 20秒的过程中, 宿主线程并没有被阻塞。可以继承点击其他按钮B. 可以不等codeActivity2的Sleep 20秒的过程结束,就可以直接点击后面的按钮,触发tow与three,此时,这些执行将在实例里排队,最后都会被依次执行开始-09-12 14:39:22线程0x954 已退出,返回值为0 (0x0)。线程0x1b0 已退出,返回值为0 (0x0)。two2007-09-12 14:39:42three2007-09-12 14:39:42由于是排队,codeActivity3与codeActivity4,的执行,几乎没有时间差2.6 使用ManualWorkflowSchedulerService开始2007-09-12 14:43:13One(随后 sleep 20M)2007-09-12 14:43:13two2007-09-12 14:43:38three2007-09-12 14:43:40操作过程是1,run (启动 - codeActivity1 - one idel)2,run (触发one -codeActivity2 - two idel)3,run (触发two - codeActivity3 - three idel)4,run (触发three - codeActivity4 - 完成)当实例没有进入idel时,宿组线程是被阻塞的,这时无法操作任何按钮,程序也进入一种无响应状态注意:A. 对实例的所有操作只有执行ManualWorkflowSchedulerSe

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论