调用子流程

 InvokeWorkflowActivity是干吗用的,CallExternalMethodActivityHandleExternalEventActivity还好,知道等等外面干活的,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多比这简单的方法,这个例子的主要演示了如何将工作流的业务处理封装到自定义引擎中 

调用子流程思路如下
调用子流程

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

调用子流程 public class 控制类
调用子流程调用子流程    
调用子流程{
调用子流程     
调用子流程        
//外部事件
调用子流程
        [Serializable()]
调用子流程        
public class 事件标志 : System.Workflow.Activities.ExternalDataEventArgs
调用子流程调用子流程    
调用子流程{
调用子流程        
private Guid 实例GUID_存值;
调用子流程
调用子流程        
public string 自定义存值;
调用子流程
调用子流程        
public 事件标志(Guid instanceId)
调用子流程            : 
base(instanceId)
调用子流程调用子流程        
调用子流程{
调用子流程            
this.实例GUID_存值 = instanceId;
调用子流程        }

调用子流程
调用子流程        
public Guid 实例GUID
调用子流程调用子流程        
调用子流程{
调用子流程调用子流程            
get 调用子流程return this.实例GUID_存值; }
调用子流程调用子流程            
set 调用子流程this.实例GUID_存值 = value; }
调用子流程        }

调用子流程    }

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

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

调用子流程        }

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

调用子流程   
调用子流程        }

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

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

调用子流程                Console.WriteLine(
"内部完成事件:工作流完成");
调用子流程            }

调用子流程
调用子流程            
调用子流程            
调用子流程        }

调用子流程        
调用子流程}

调用子流程

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


 

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