调用子流程

  InvokeWorkflowActivity是干吗用的, CallExternalMethodActivity与 HandleExternalEventActivity还好,知道等等外面干活的, InvokeWorkflowActivity可到好,傻小子放炮,点上就跑,也不知站住看一下,看看 MS对它的解释 :

Asynchronously runs one workflow from another. This class cannot be inherited.
InvokeWorkflowActivity then creates and invokes a workflow instance of the specified type, passing the parameters that have been provided. As soon as the workflow has been invoked, the InvokeWorkflowActivity finishes immediately.
Use the InvokeWorkflowActivity to start one workflow from another. The InvokeWorkflowActivity completes before the launched workflow starts executing and the next activity in the workflow branch is executed.

 异步,而且还没回调,异步我要你干吗。

 看一下这个例子吧,用了一个多线程常用的方式解决了调用子流程的问题,看这个例子注意以下几点:

1.不用InvokeWorkflowActivity也能实现调用子流程
2.这个例子的中心思想不是如何用InvokeWorkflowActivity调用子流程,我有N多比这简单的方法,这个例子的主要演示了如何将工作流的业务处理封装到自定义引擎中 

调用子流程思路如下
9.JPG

本例是通过重写WorkflowRuntime实现,也就是说以上活动没在在宿主中实现,全过程对宿主来说是一个黑盒

None.gif   public   class  控制类
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif     
InBlock.gif        
//外部事件
InBlock.gif
        [Serializable()]
InBlock.gif        
public class 事件标志 : System.Workflow.Activities.ExternalDataEventArgs
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
private Guid 实例GUID_存值;
InBlock.gif
InBlock.gif        
public string 自定义存值;
InBlock.gif
InBlock.gif        
public 事件标志(Guid instanceId)
InBlock.gif            : 
base(instanceId)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
this.实例GUID_存值 = instanceId;
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public Guid 实例GUID
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get dot.gifreturn this.实例GUID_存值; }
ExpandedSubBlockStart.gifContractedSubBlock.gif            
set dot.gifthis.实例GUID_存值 = value; }
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif       
InBlock.gif        [System.Workflow.Activities.ExternalDataExchange()]
InBlock.gif        
public interface 外部事件映射接口
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
event System.EventHandler<事件标志> 子流程完成事件;
ExpandedSubBlockEnd.gif        }

InBlock.gif        
InBlock.gif        
public class 功能类_外部事件 : 外部事件映射接口
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
public event EventHandler<事件标志> 子流程完成事件;
InBlock.gif            
public void 触发子流程完成事件(object sender, Guid id, string 自定义存值)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                事件标志 e 
= new 事件标志(id);
InBlock.gif                e.自定义存值 
= 自定义存值;
InBlock.gif                子流程完成事件(sender, e);
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
//外部方法
InBlock.gif
        [System.Workflow.Activities.ExternalDataExchange()]
InBlock.gif        
public interface 外部方法映射接口
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gifvoid 子流程完成(string 所属父流程ID, string 流程ID);}
InBlock.gif   
InBlock.gif        
public class 功能类_外部方法 : 外部方法映射接口
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
public string 父流程ID=null;
InBlock.gif            
public string 当前流程ID = null;
InBlock.gif            
public void 子流程完成(string 所属父流程ID, string 流程ID)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                当前流程ID 
= 流程ID;
InBlock.gif                父流程ID 
= 所属父流程ID;
InBlock.gif                Console.WriteLine(
"方法已被触发");
ExpandedSubBlockEnd.gif            }

InBlock.gif   
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
//改写引擎
InBlock.gif
        public class 自定义工作流引擎 : System.Workflow.Runtime.WorkflowRuntime
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            System.Workflow.Activities.ExternalDataExchangeService 外部数据通信服务;
InBlock.gif            功能类_外部事件 外事
=new 功能类_外部事件();
InBlock.gif            功能类_外部方法 外方
=new 功能类_外部方法();
InBlock.gif
InBlock.gif            
public 自定义工作流引擎()
InBlock.gif                :
base()
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                外部数据通信服务 
= new System.Workflow.Activities.ExternalDataExchangeService();
InBlock.gif                test.宿主(
"自定义引擎中""准备向引擎添加外部数据通信服务");
InBlock.gif                
this.AddService(外部数据通信服务);
InBlock.gif                外部数据通信服务.AddService(外事);
InBlock.gif                外部数据通信服务.AddService(外方);
InBlock.gif                
this.WorkflowCompleted += new EventHandler<System.Workflow.Runtime.WorkflowCompletedEventArgs>(自定义工作流引擎_WorkflowCompleted);
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            
void 自定义工作流引擎_WorkflowCompleted(object sender, System.Workflow.Runtime.WorkflowCompletedEventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif          
InBlock.gif                
if (外方.父流程ID !=null )
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    Console.WriteLine(
"内部完成事件:触发:子流程完成事件");
InBlock.gif                    外事.触发子流程完成事件(
"wxd",new Guid(外方.父流程ID),"wxwinter");
InBlock.gif                    外方.父流程ID 
= null;
ExpandedSubBlockEnd.gif                }

InBlock.gif                Console.WriteLine(
"内部完成事件:工作流完成");
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            
InBlock.gif            
ExpandedSubBlockEnd.gif        }

InBlock.gif        
ExpandedBlockEnd.gif}

None.gif

例子 WWF调试模板(子流程).rar


 

转载于:https://www.cnblogs.com/foundation/archive/2006/10/25/540033.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值