wf打包通信服务关联与_第1页
wf打包通信服务关联与_第2页
wf打包通信服务关联与_第3页
wf打包通信服务关联与_第4页
wf打包通信服务关联与_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

1、1CorrelationToken 关联CallExternalMethodActivity 与HandleExternalEventActivity一个实例有多个相同事件接口的 HandleExternalEventActivity 并发在等待事件的外部触发时,外部触发要明确的指定触发那个 HandleExternalEventActivity,否则将产生逻辑错误。要解决这个问题,必须使用 CorrelationToken要使用 CorrelationToken,要成对使用 CallExternalMethodActivity 与 HandleExternalEventActivity,不管

2、理是否需要 CallExternalMethodActivity 的业务逻辑存在。使用 System.Workflow.Runtime.CorrelationToken 为每对 CallExternalMethodActivity与 HandleExternalEventActivity 设定一组关联标记,当宿主中要触发一个外部事件时,可以传递两个参数,一个是实例的 ID 号,一个是关联标记。这样引擎就知道要触发的是指定实例 ID 的,指定关联标记HandleExternalEventActivity的1.1 绑定类的设计1.在同一接口中定义 CallExternalMethodActivit

3、y 与HandleExternalEventActivity 的绑定2.接口中用添加关联参数成员属性3.为 CallExternalMethodActivity 的方法添加关联参数的初如化成员属性4.为 HandleExternalEventActivity 的事件添加关联参数的别名绑定5.定义事件参数,事件参数中要有 CorrelationAlias(EventAlias, e.EventAlias)指定的属性6.全部实现代码/接口 System.Workflow.Activities.ExternalDataExchangeSystem.Workflow.Activities.Correl

4、ationParameter(EventAlias) publicerface IExternalEventSystem.Workflow.Activities.CorrelationInitializer/关联参数/对应到事件的属性 System.Workflow.Activities.CorrelationAlias(EventAlias, e.EventAlias) event Evenndler WxdEvent;CorrelationAlias(参数 1, 参数 2)参数 1:与对应 CorrelationParameter(EventAlias)参数 2:与之绑定的事件的参数中的属

5、性System.Workflow.Activities.CorrelationInitializervoid CreateBallot(string EventAlias, object value);注意,方法的参数中要有与定指定的关联参数名一样的如CorrelationParameter(EventAlias)string EventAliasSystem.Workflow.Activities.CorrelationParameter(EventAlias)void CreateBallot(string EventAlias, object value);/关联参数/对应到事件的属性

6、System.Workflow.Activities.CorrelationAlias(EventAlias, e.EventAlias)event Evenndler WxdEvent;/事件参数 Serializablepublic class EventArgs : System.Workflow.Activities.ExternalDataEventArgs/自定义数据属性public object WxdData;/关联参数对应的事件参数 private string _EventAlias; public string EventAliasget return _EventAli

7、as; set _EventAlias = value; /构造函数public EventArgs(Guid instanceId, string EventAlia): base(instanceId)_EventAlias = EventAlia;/接口实现类public class WxdExternalEvent : IExternalEvent/实现接口事件public event Evenndler WxdEvent;/实现接口方法public void CreateBallot(string EventAlias, object value)1.2 工作流的设计System.C

8、onsole.Wriine(方法调用:EventAlias : + EventAlias);/触发事件public void OnWxdEvent(Guid instanceId, string EventAlias,object wxdData)EventArgs e = new EventArgs(instanceId, EventAlias); e.WxdData = wxdData;WxdEvent(null, e);代码public sealed partial class Workflow1: SequentialWorkflowActivitypublic Workflow1()

9、ponent();private voidponent()this.CanModifyActivities = true;说明:CorrlationToken 属性,只有按上文方式设计的绑定类才会出现,在属性值框中输入名称,设计器会自动为其添加对象生成代码同一容器中的 CallExternalMethodActivity 与HandleExternalEventActivity 设为同一个CorrlationToken 以上方式,如果三个都绑定到同一名称的 CorrlationToken,将无法正常使用,如果自定义 Activity 中使用 CorrlationToken 关联 CallExt

10、ernalMethodActivity 与 HandleExternalEventActivity,将该 Activity 的多个实例添加到工作流中,不会因多个实例使用了同一 CorrlationToken 名而出现问题System.Workflow.Runtime.CorrelationToken correlationtoken1 = new System.Workflow.Runtime.CorrelationToken();System.Workflow.Runtime.CorrelationToken correlationtoken2 = newSystem.Workflow.Ru

11、ntime.CorrelationToken();SponentM.WorkflorameterBinding workflorameterbinding1 =new SponentM.WorkflorameterBinding();System.Workflow.Runtime.CorrelationToken correlationtoken3 = new System.Workflow.Runtime.CorrelationToken();System.Workflow.Runtime.CorrelationToken correlationtoken4 = newSystem.Work

12、flow.Runtime.CorrelationToken();SponentM.WorkflorameterBinding workflorameterbinding2 =new SponentM.WorkflorameterBinding();System.Workflow.Runtime.CorrelationToken correlationtoken5 = newSystem.Workflow.Runtime.CorrelationToken();SponentM.WorkflorameterBinding workflorameterbinding3 =new SponentM.W

13、orkflorameterBinding();this.handleExternalEventActivity3 = new System.Workflow.Activities.HandleExternalEventActivity();this.callExternalMethodActivity3 = new System.Workflow.Activities.CallExternalMethodActivity();this.handleExternalEventActivity2 = new System.Workflow.Activities.HandleExternalEven

14、tActivity();this.callExternalMethodActivity2 = new System.Workflow.Activities.CallExternalMethodActivity();this.handleExternalEventActivity1 = new System.Workflow.Activities.HandleExternalEventActivity();this.callExternalMethodActivity1 = new System.Workflow.Activities.CallExternalMethodActivity();t

15、his.sequenceActivity3 = new System.Workflow.Activities.SequenceActivity(); this.sequenceActivity2 = new System.Workflow.Activities.SequenceActivity(); this.sequenceActivity1 = new System.Workflow.Activities.SequenceActivity(); this.parallelActivity1 = new System.Workflow.Activities.ParallelActivity(

16、);/ handleExternalEventActivity3/correlationtoken1.Name = group3; correlationtoken1.OwnerActivityName = sequenceActivity3;this.handleExternalEventActivity3.CorrelationToken = correlationtoken1;this.handleExternalEventActivity3.EventName = WxdEvent;this.handleExternalEventActivity3.typeof(WorkflowLib

17、rary3.IExternalEvent);erfaceType =this.handleExternalEventActivity3.Name = handleExternalEventActivity3; this.handleExternalEventActivity3.Invoked += newndler(this.handleExternalEventASystem.Evenctivity3_Invoked);/ callExternalMethodActivity3/correlationtoken2.Name = group3; correlationtoken2.OwnerA

18、ctivityName = sequenceActivity3; this.callExternalMethodActivity3.CorrelationToken = correlationtoken2;this.callExternalMethodActivity3.typeof(WorkflowLibrary3.IExternalEvent);erfaceType =this.callExternalMethodActivity3.MethodName = CreateBallot;this.callExternalMethodActivity3.Name = callExternalM

19、ethodActivity3;workfloworkflorameterbinding1.ParameterName = EventAlias;rameterbinding1.Value = c;this.callExternalMethodActivity3.ParameterBindings.Add(workflo/ handleExternalEventActivity2/correlationtoken3.Name = group2; correlationtoken3.OwnerActivityName = sequenceActivity2;rameterbinding1);thi

20、s.handleExternalEventActivity2.CorrelationToken = correlationtoken3;this.handleExternalEventActivity2.EventName = WxdEvent;this.handleExternalEventActivity2.typeof(WorkflowLibrary3.IExternalEvent);erfaceType =this.handleExternalEventActivity2.Name = handleExternalEventActivity2; this.handleExternalE

21、ventActivity2.Invoked += newndler(this.handleExternalEventASystem.Evenctivity2_Invoked);/ callExternalMethodActivity2/correlationtoken4.Name = group2;correlationtoken4.OwnerActivityName = sequenceActivity2; this.callExternalMethodActivity2.CorrelationToken = correlationtoken4;this.callExternalMethod

22、Activity2.erfaceType =typeof(WorkflowLibrary3.IExternalEvent);this.callExternalMethodActivity2.MethodName = CreateBallot; this.callExternalMethodActivity2.Name = callExternalMethodActivity2;workfloworkflorameterbinding2.ParameterName = EventAlias;rameterbinding2.Value = b;this.callExternalMethodActi

23、vity2.ParameterBindings.Add(workflo/ handleExternalEventActivity1/correlationtoken5.Name = group1; correlationtoken5.OwnerActivityName = sequenceActivity1;rameterbinding2);this.handleExternalEventActivity1.CorrelationToken = correlationtoken5;this.handleExternalEventActivity1.EventName = WxdEvent;th

24、is.handleExternalEventActivity1.typeof(WorkflowLibrary3.IExternalEvent);erfaceType =this.handleExternalEventActivity1.Name = handleExternalEventActivity1; this.handleExternalEventActivity1.Invoked += newndler(this.handleExternalEventASystem.Evenctivity1_Invoked);/ callExternalMethodActivity1/this.ca

25、llExternalMethodActivity1.CorrelationToken = correlationtoken5;this.callExternalMethodActivity1.typeof(WorkflowLibrary3.IExternalEvent);erfaceType =this.callExternalMethodActivity1.MethodName = CreateBallot;this.callExternalMethodActivity1.Name = callExternalMethodActivity1;workfloworkflorameterbind

26、ing3.ParameterName = EventAlias;rameterbinding3.Value = a;this.callExternalMethodActivity1.ParameterBindings.Add(workflo/ sequenceActivity3/rameterbinding3);this.sequenceActivity3.Activities.Add(this.callExternalMethodActivity3); this.sequenceActivity3.Activities.Add(this.handleExternalEventActivity

27、3); this.sequenceActivity3.Name = sequenceActivity3;/ sequenceActivity2/this.sequenceActivity2.Activities.Add(this.callExternalMethodActivity2); this.sequenceActivity2.Activities.Add(this.handleExternalEventActivity2); this.sequenceActivity2.Name = sequenceActivity2;/ sequenceActivity1/ this.sequenc

28、eActivity1.Activities.Add(this.callExternalMethodActivity1); this.sequenceActivity1.Activities.Add(this.handleExternalEventActivity1); this.sequenceActivity1.Name = sequenceActivity1;/ parallelActivity1/ this.parallelActivity1.Activities.Add(this.sequenceActivity1); this.parallelActivity1.Activities

29、.Add(this.sequenceActivity2); this.parallelActivity1.Activities.Add(this.sequenceActivity3); this.parallelActivity1.Name = parallelActivity1;/ Workflow1/thiivities.Add(this.parallelActivity1);this.Name = Workflow1;this.CanModifyActivities = false;private private private private private private priva

30、te private privateprivateHandleExternalEventActivity handleExternalEventActivity1; CallExternalMethodActivity callExternalMethodActivity1; SequenceActivity sequenceActivity3;SequenceActivity sequenceActivity2; SequenceActivity sequenceActivity1;HandleExternalEventActivity handleExternalEventActivity

31、2; HandleExternalEventActivity handleExternalEventActivity3; CallExternalMethodActivity callExternalMethodActivity3; CallExternalMethodActivity callExternalMethodActivity2;ParallelActivity parallelActivity1;private void handleExternalEventActivity1_Invoked(objecder, ExternalDataEventArgs e)1.3 运行工作流

32、引擎代码class beginsic AutoResetEvent waindle = new AutoResetEvent(false); sic void Main()System.Workflow.Runtime.WorkflowRuntime run = new System.Workflow.Runtime.WorkflowRuntime();pleted += newEvenndler(pleted); ExternalDataExchangeService exchange = new ExternalDataExchangeService(); run.AddService(e

33、xchange);WxdExternalEvent EXobj = new WxdExternalEvent(); exchange.AddService(EXobj);run.StartRuntime();EventArgs temp = (EventArgs)e;System.Console.Wriine(handleExternalEventActivity1:0:1 ,temp.EventAlias,temp.WxdDa oString();private void handleExternalEventActivity2_Invoked(objecder, ExternalDataE

34、ventArgs e)EventArgs temp = (EventArgs)e;System.Console.Wriine(handleExternalEventActivity2:0:1, temp.EventAlias, temp.WxdDaoString();private void handleExternalEventActivity3_Invoked(objecder, ExternalDataEventArgs e)EventArgs temp = (EventArgs)e;System.Console.Wriine(handleExternalEventActivity3:0

35、:1, temp.EventAlias, temp.WxdDaoString();结果System.Workflow.Runtime.WorkflowInstance ins = run.CreateWorkflow(typeof(Workflow1); ins.Start();System.Console.Wriine(wait);System.Console.ReadLine();/此处等一下,否则有可能产生工作流实例的方法还没运行,事件就已触发的情况EXobj.OnWxdEvent(ins.InstanceId, a, ok); EXobj.OnWxdEvent(ins.Instance

36、Id, b, yes); EXobj.OnWxdEvent(ins.InstanceId, c, no); waindle.WaitOne();System.Console.Read();sic voidpleted(objecder, System.Workflow.R pletedEventArgs e)System.Console.Wriine(end); waindle.Set();2封装 CallExternalMethodActivity 与HandleExternalEventActivity在同一个工作流的并行分支上使用同名 CorrlationToken 关联可能会出现问题,

37、 在自定义 Activity 中使用 CorrlationToken 关联 CallExternalMethodActivity 与HandleExternalEventActivity,将该 Activity 的多个实例添加到工作流中,不会因多个实例使用了同一 CorrlationToken 名而出现问题2.1 绑定类的设计与上例相同2.2 自定义Activity 的设计public partial clasivity1: SequenceActivitypublic Activity1()ponent();private voidponent()this.CanModifyActiviti

38、es = true; System.Workflow.Runtime.CorrelationToken correlationtoken1 = newSystem.Workflow.Runtime.CorrelationToken();SponentM.ActivityBind activitybind1 = newSponentM.ActivityBind();SponentM.WorkflorameterBinding workflorameterbinding1 =new SponentM.WorkflorameterBinding();this.handleExternalEventA

39、ctivity1 = new System.Workflow.Activities.HandleExternalEventActivity();this.callExternalMethodActivity1 = new System.Workflow.Activities.CallExternalMethodActivity();/ handleExternalEventActivity1/correlationtoken1.Name = gp1; correlationtoken1.OwnerActivityName = Activity1;this.handleExternalEvent

40、Activity1.CorrelationToken = correlationtoken1;this.handleExternalEventActivity1.EventName = WxdEvent;this.handleExternalEventActivity1.typeof(WorkflowLibrary3.IExternalEvent);erfaceType =this.handleExternalEventActivity1.Name = handleExternalEventActivity1; this.handleExternalEventActivity1.Invoked

41、 += newndler(this.handleExternalEventASystem.Evenctivity1_Invoked);/ callExternalMethodActivity1/this.callExternalMethodActivity1.CorrelationToken = correlationtoken1;this.callExternalMethodActivity1.typeof(WorkflowLibrary3.IExternalEvent);erfaceType =this.callExternalMethodActivity1.MethodName = Cr

42、eateBallot;this.callExternalMethodActivity1.Name = callExternalMethodActivity1;activitybind1.Name = Activity1;activitybind1.Path = EventAlias;workflorameterbinding1.ParameterName = EventAlias;workflorameterbinding1.SetBinding(SponentM.WorkflorameterBinding.ValueProperty, (SponentM.ActivityBind)(acti

43、vitybind1);this.callExternalMethodActivity1.ParameterBindings.Add(workflo/ Activity1/rameterbinding1);thithiivities.Add(this.callExternalMethodActivity1);ivities.Add(this.handleExternalEventActivity1);this.Name = Activity1;this.CanModifyActivities = false;private HandleExternalEventActivity handleEx

44、ternalEventActivity1; private CallExternalMethodActivity callExternalMethodActivity1;public sic DependencyProperty EventAliasProperty =DependencyProperty.Register(EventAlias, typeof(System.String), typeof(WorkflowLibrary3.Activity1);public String EventAliasgetreturn (string)(base.GetValue(WorkflowLi

45、brary3.Activity1.EventAliasProperty);setbase.SetValue(WorkflowLibrary3.Activity1.EventAliasProperty, value);private void handleExternalEventActivity1_Invoked(objecder, ExternalDataEventArgs e)System.Console.Wriine(this.EventAlias);2.3 工作流设计public sealed partial class Workflow2: SequentialWorkflowAct

46、ivitypublic Workflow2()ponent();private voidponent()this.CanModifyActivities = true;thi thithiivity13 = new WorkflowLibrary3.Activity1(); ivity12 = new WorkflowLibrary3.Activity1();ivity11 = new WorkflowLibrary3.Activity1();this.sequenceActivity3 = new System.Workflow.Activities.SequenceActivity();

47、this.sequenceActivity2 = new System.Workflow.Activities.SequenceActivity(); this.sequenceActivity1 = new System.Workflow.Activities.SequenceActivity(); this.parallelActivity1 = new System.Workflow.Activities.ParallelActivity();/ activity13/thi thi/ivity13.EventAlias = c;ivity13.Name = activity13;/ a

48、ctivity12/thi thi/ivity12.EventAlias = b;ivity12.Name = activity12;/ activity11/thi thi/ivity11.EventAlias = a;ivity11.Name = activity11;/ sequenceActivity3/ this.sequenceActivity3.Activities.Add(thiivity13);this.sequenceActivity3.Name = sequenceActivity3;/ sequenceActivity2/this.sequenceActivity2.Activities.Add(thiivity12);this.sequenceActivity2.Name = sequenceActivity2;/ sequ

温馨提示

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

评论

0/150

提交评论