zoukankan      html  css  js  c++  java
  • 通过AEC解读WF的核心原理(十)取消与取消处理器

    说明

    例子下载:

    https://files.cnblogs.com/wxwinter/aec10_1.rar

    https://files.cnblogs.com/wxwinter/aec10_2.rar

     

    取消的实现

    取消处理器CancellationHandlerActivity的使用

     

     

    例子:取消

    内容控件Activity

    public class 内容控件: Activity

        {

    protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)

    {

    this.Invoke(正常业务, new EventArgs());

    return ActivityExecutionStatus.Executing;

    }

     

    protected override ActivityExecutionStatus Cancel(ActivityExecutionContext executionContext)

    {

    System.Console.WriteLine("取消");

    this.Invoke(取消业务, new EventArgs());

    return ActivityExecutionStatus.Canceling;

    // return ActivityExecutionStatus.Closed;

    }

     

    void 正常业务(object sender, EventArgs e)

    {

    System.Console.WriteLine("wxwinter");

    ActivityExecutionContext aec = sender as ActivityExecutionContext;

    aec.CloseActivity();

    }

     

    void 取消业务(object sender, EventArgs e)

    {

    //用于处理取消是否恢复的业务

    ActivityExecutionContext aec = sender as ActivityExecutionContext;

    aec.CloseActivity();

    }

        }

     

    容器控件Activity

    public class 容器控件: SequenceActivity

        {

            public 容器控件()

            {

                InitializeComponent();

            }

     

    [System.Diagnostics.DebuggerNonUserCode]

    private void InitializeComponent()

    {

    this.CanModifyActivities = true;

    this.内容控件1 = new wxwinterAecTest.内容控件();

    this.内容控件1.Name = "内容控件1";

    this.Activities.Add(this.内容控件1);

    this.CanModifyActivities = false;

    }

     

    private 内容控件 内容控件1;

     

    protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)

    {

    this.内容控件1.Closed += activity11_Closed;

    this.内容控件1.Executing+=new EventHandler<ActivityExecutionStatusChangedEventArgs>(activity11_Executing);

    executionContext.ExecuteActivity(this.内容控件1);

    return ActivityExecutionStatus.Executing;

     

    }

     

    bool IsCancel = false;

     

    void activity11_Executing(object sender, ActivityExecutionStatusChangedEventArgs e)

    {

    IsCancel = true; //一个模拟要取消的业务情形

    if (IsCancel)

    {

    ActivityExecutionContext aec = sender as ActivityExecutionContext;

    aec.CancelActivity(this.内容控件1);

    }

    }

     

    void activity11_Closed(object sender, ActivityExecutionStatusChangedEventArgs e)

    {

    e.Activity.Closed -= activity11_Closed;

    ActivityExecutionContext aec = sender as ActivityExecutionContext;

    aec.CloseActivity();

    }

        }

     

    测试用工作流

    public class Workflow1: SequentialWorkflowActivity

    {

    private 容器控件 容器控件1;

            public Workflow1()

            {

                InitializeComponent();

            }

     

    [System.Diagnostics.DebuggerNonUserCode]

    private void InitializeComponent()

    {

    this.CanModifyActivities = true;

    this.容器控件1 = new wxwinterAecTest.容器控件();

    //

    // 容器控件1

    //

    this.容器控件1.Name = "容器控件1";

    //

    // Workflow1

    //

    this.Activities.Add(this.容器控件1);

    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");

    }

     

    }

     

    运行结果

    IsCancel = true;

    IsCancel = false

     

    例子:取消处理器CancellationHandlerActivity

    支持取消的控件Activity

    public class 支持取消的控件 : SequenceActivity

    {

    protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)

    {

    this.EnabledActivities[0].Closed +=Activity_Closed;

    executionContext.ExecuteActivity(this.EnabledActivities[0]);

    return ActivityExecutionStatus.Executing;

    }

     

    void Activity_Closed(object sender, ActivityExecutionStatusChangedEventArgs e)

    {

    ActivityExecutionContext aec = sender as ActivityExecutionContext;

    aec.CloseActivity();

    }

     

    protected override ActivityExecutionStatus Cancel(ActivityExecutionContext executionContext)

    {

    foreach (var v in this.Activities)

    {

    if (v is CancellationHandlerActivity)

    {

    v.Closed += CancellationHandlerActivity_Closed;

    executionContext.ExecuteActivity(v);

    return ActivityExecutionStatus.Canceling;

    }

    }

    return ActivityExecutionStatus.Closed;

    }

     

    void CancellationHandlerActivity_Closed(object sender, ActivityExecutionStatusChangedEventArgs e)

    {

    ActivityExecutionContext aec = sender as ActivityExecutionContext;

    aec.CloseActivity();

    }

     

    }

     

    可取消的容器Activity

    public class 可取消的容器 : SequenceActivity

    {

    protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)

    {

    this.EnabledActivities[0].Closed += activity_Closed;

    this.EnabledActivities[0].Executing += activity_Executing;

    executionContext.ExecuteActivity(this.EnabledActivities[0]);

    return ActivityExecutionStatus.Executing;

    }

    public bool 是否取消 { get; set; }

    void activity_Executing(object sender, ActivityExecutionStatusChangedEventArgs e)

    {

    if (是否取消)

    {

    ActivityExecutionContext aec = sender as ActivityExecutionContext;

    aec.CancelActivity(this.EnabledActivities[0]);

    }

    }

     

    void activity_Closed(object sender, ActivityExecutionStatusChangedEventArgs e)

    {

    e.Activity.Closed -= activity_Closed;

    ActivityExecutionContext aec = sender as ActivityExecutionContext;

    aec.CloseActivity();

    }

    }

     

    测试用工作流

     

     

     

     

    public class Workflow1: SequentialWorkflowActivity

    {

    private CodeActivity 正常路径业;

    private 支持取消的控件 支持取消的控件1;

    private CodeActivity 取消业务路径;

    private CancellationHandlerActivity cancellationHandlerActivity1;

    private 可取消的容器 可取消的容器1;

     

            public Workflow1()

            {

                InitializeComponent();

            }

    [System.Diagnostics.DebuggerNonUserCode]

    private void InitializeComponent()

    {

    this.CanModifyActivities = true;

    this.取消业务路径 = new System.Workflow.Activities.CodeActivity();

    this.cancellationHandlerActivity1 = new System.Workflow.ComponentModel.CancellationHandlerActivity();

    this.正常路径业 = new System.Workflow.Activities.CodeActivity();

    this.支持取消的控件1 = new wxwinterAecTest.支持取消的控件();

    this.可取消的容器1 = new wxwinterAecTest.可取消的容器();

    //

    // 取消业务路径

    //

    this.取消业务路径.Name = "取消业务路径";

    this.取消业务路径.ExecuteCode += new System.EventHandler(this.取消业务路径_ExecuteCode);

    //

    // cancellationHandlerActivity1

    //

    this.cancellationHandlerActivity1.Activities.Add(this.取消业务路径);

    this.cancellationHandlerActivity1.Name = "cancellationHandlerActivity1";

    //

    // 正常路径业

    //

    this.正常路径业.Name = "正常路径业";

    this.正常路径业.ExecuteCode += new System.EventHandler(this.正常路径业_ExecuteCode);

    //

    // 支持取消的控件1

    //

    this.支持取消的控件1.Activities.Add(this.正常路径业);

    this.支持取消的控件1.Activities.Add(this.cancellationHandlerActivity1);

    this.支持取消的控件1.Name = "支持取消的控件1";

    //

    // 可取消的容器1

    //

    this.可取消的容器1.Activities.Add(this.支持取消的控件1);

    this.可取消的容器1.Name = "可取消的容器1";

    this.可取消的容器1.是否取消 = true;

    //

    // Workflow1

    //

    this.Activities.Add(this.可取消的容器1);

    this.Name = "Workflow1";

    this.CanModifyActivities = false;

    }

     

    private void 正常路径业_ExecuteCode(object sender, EventArgs e)

    {

    System.Console.WriteLine("正常执行");

    }

     

    private void 取消业务路径_ExecuteCode(object sender, EventArgs e)

    {

    System.Console.WriteLine("取消执行");

    }

        }

     

    宿主

    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");

    }

     

    }

     

    运行结果

     

     

     

     

  • 相关阅读:
    传感器系列之4.4超声测距传感器
    传感器系列之4.3流量传感器
    传感器系列之4.2气压传感器
    传感器系列之4.12GPS定位传感器
    传感器系列之4.1振动传感实验
    传感器系列之3.4继电器
    传感器系列之3.2直流电机
    Spring切面编程步骤
    SpringMVC中的java.lang.ClassNotFoundException: org.aspectj.weaver.BCException 调试过程记录
    SpringMVC中使用@Value给非String类型注入值
  • 原文地址:https://www.cnblogs.com/foundation/p/1217347.html
Copyright © 2011-2022 走看看