zoukankan      html  css  js  c++  java
  • 通过AEC解读WF的核心原理(六)创建复本ForEach循环

    说明

    例子下载:https://files.cnblogs.com/wxwinter/aec6.rar

     

    一个ForEach的例子,与Replicator功能类似。

    本例主要演示如何创建Activity的执行副本

     

     

    本例知识点:

     

    ActivityExecutionContextManager:该类允许CompositeActivity创建和管理childActivity的AEC

    属性

    ExecutionContexts

    获取由当前Activity创建的AEC集合

    PersistedExecutionContexts

    获取由当前Activity创建的已经完成并被持久化的AEC集合。

    属性值Guid集合描述所有被持久化的AEC集合。

     

    方法

    CompleteExecutionContext

    标记AEC已经完成。将完成的AEC存放在ExecutionContexts属性中。工作流引擎只允许ActivityClosed状态中才能执行成功。forcePersist参数是说明是否将指定的AEC持久化。被持久化后的AEC可以被恢复。该属性默认值为false

    CreateExecutionContext

    创建指定ActivityAEC

    GetExecutionContext

    获取与指定Activity相关联的第一个AEC。因为一个Activity可能存在多个AEC

    GetPersistedExecutionContext

    获取与指定Guid相应的被持久化的AEC。获取的AEC将被存放在ExecutionContexts属性中并在PersistedExecutionContexts属性中移除被获取的AEC

     

     

     

    例子

    SendMessag的Activity

    public class SendMessage:Activity

        {

     

     

    public string Message

    {

    get { return (string)GetValue(MessageProperty); }

    set { SetValue(MessageProperty, value); }

    }

     

    public static readonly DependencyProperty MessageProperty =DependencyProperty.Register("Message", typeof(string), typeof(SendMessage), new PropertyMetadata(""));

     

    protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)

    {

    System.Console.WriteLine(this.Message);

    return ActivityExecutionStatus.Closed;

    }

        }

     

    ForEach的Activity

    public class ForEach: SequenceActivity

    {

    public static readonly DependencyProperty DataItemsProperty = DependencyProperty.Register("DataItems", typeof(String[]), typeof(ForEach));

    public String[] DataItems

    {

    get { return (String[])GetValue(DataItemsProperty); }

    set { SetValue(DataItemsProperty, value); }

    }

    int i=0;

    protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)

    {

    if (EnabledActivities.Count == 0 || DataItems == null || DataItems.Count() == 0)

    {

    return ActivityExecutionStatus.Closed;

    }

    if (EnabledActivities[0] is SendMessage)

    {

    ExecuteDataItem(executionContext);

    return ActivityExecutionStatus.Executing;

    }

    return base.Execute(executionContext);

    }

     

    void activity_Closed(object sender, ActivityExecutionStatusChangedEventArgs e)

    {

    e.Activity.Closed -= activity_Closed;

    ActivityExecutionContext aec = sender as ActivityExecutionContext;

    ActivityExecutionContext childContext = aec.ExecutionContextManager.GetExecutionContext(e.Activity);

    aec.ExecutionContextManager.CompleteExecutionContext(childContext);

    if(i==DataItems.Count()-1)

    {

    aec.CloseActivity();

    }

    else

    {

    i = i + 1;

    ExecuteDataItem(aec);

    }

    }

     

    private void ExecuteDataItem(ActivityExecutionContext executionContext)

    {

    Activity activity = EnabledActivities[0];

    ActivityExecutionContext newContext = executionContext.ExecutionContextManager.CreateExecutionContext(activity);

    newContext.Activity.Closed += activity_Closed;

    newContext.Activity.SetValue(SendMessage.MessageProperty, DataItems[i]);

    newContext.ExecuteActivity(newContext.Activity);

    }

    }

     

    测试用工作流

    public class Workflow1: SequentialWorkflowActivity

    {

    private SendMessage sendMessage1;

    private ForEach forEach1;

     

            public Workflow1()

            {

                InitializeComponent();

            }

    [System.Diagnostics.DebuggerNonUserCode]

    private void InitializeComponent()

    {

    this.CanModifyActivities = true;

    this.sendMessage1 = new wxwinterAecTest.SendMessage();

    this.forEach1 = new wxwinterAecTest.ForEach();

    //

    // sendMessage1

    //

    this.sendMessage1.Message = "";

    this.sendMessage1.Name = "sendMessage1";

    //

    // forEach1

    //

    this.forEach1.Activities.Add(this.sendMessage1);

    this.forEach1.DataItems = new string[] {

    "wxd",

    "wxwinter",

    "lzm"};

    this.forEach1.Name = "forEach1";

    //

    // Workflow1

    //

    this.Activities.Add(this.forEach1);

    this.Name = "Workflow1";

    this.CanModifyActivities = false;

     

    }

        }

     

    宿主

    class Program

    {

    static void Main()

    {

    WorkflowRuntime workflowRuntime = new WorkflowRuntime();

    workflowRuntime.WorkflowCompleted +=new EventHandler<WorkflowCompletedEventArgs>(workflowRuntime_WorkflowCompleted);

    workflowRuntime.WorkflowTerminated +=new EventHandler<WorkflowTerminatedEventArgs>(workflowRuntime_WorkflowTerminated);

    workflowRuntime.WorkflowIdled+=new EventHandler<WorkflowEventArgs>(workflowRuntime_WorkflowIdled);

    WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(Workflow1));

    instance.Start();

     

    System.Console.Read();

     

    }

     

    static void workflowRuntime_WorkflowIdled(object sender, WorkflowEventArgs e)

    {

    System.Console.WriteLine("WorkflowIdled");

    }

     

    static void workflowRuntime_WorkflowTerminated(object sender, WorkflowTerminatedEventArgs e)

    {

    System.Console.WriteLine("Terminated" + e.Exception.Message);

    }

     

    static void workflowRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e)

    {

    System.Console.WriteLine("WorkflowCompleted");

    }

     

    }

     

    运行结果

     

     

  • 相关阅读:
    Netty 中的内存分配浅析-数据容器
    你想了解的 HTTPS 都在这里
    加解密算法分析
    HTTP 协议详解(二)
    HTTP 协议详解
    Netty 中的内存分配浅析
    TCP / IP 精彩回顾-必看
    Netty 中的消息解析和编解码器
    Netty 中的粘包和拆包
    python 类中方法总结 --- 实例方法、类方法、静态方法
  • 原文地址:https://www.cnblogs.com/foundation/p/1217340.html
Copyright © 2011-2022 走看看