调用子流程

  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


 

你可能感兴趣的:(调用)