zoukankan      html  css  js  c++  java
  • WF4.0 基础篇 (十二) CancellationScope 取消容器

    本节主要介绍CancellationScope在异常中的使用,以及CancellationScope在Parallel 的使用.

     

    本文例子下载:

    https://files.cnblogs.com/foundation/CancellationScopeSample.rar

    本文例子说明

     

    CancellationScope 取消容器

    类名

    System.Activities.Statements.CancellationScope

    文件

    System.Activities.dll

    结构说明

    继承 NativeActivity

    是一个 sealed类

    override 了 [CacheMetadata方法] 与 [Execute方法] 与[Cancel 方法]

    [Body]属性的类型为[Activity]

    [CancellationHandler] 属性 的类型为[Activity]

    [Variables] 属性 的类型为[Collection<Variable>]

    功能说明

    [CancellationScope]中可以定义变量

    [CancellationScope]由[Body]与 [CancelHandler] 两部分组成,[Body]为正常执行路径, 如果取消执行会调用 [CancelHandler]中的内容

     

     

    实例使用[OnUnhandledException.Cancel]处理异常

    实例使用[OnUnhandledException.Cancel]处理异常时,[CancelHandler] 部分会被调用

     

    ExceptionActivity

    public sealed class ExceptionActivity : CodeActivity

    {

    protected override void Execute(CodeActivityContext context)

    {

    int v = 1 -1;

    double i = 1 / v;

    }

    }

    流程

    宿主

    //==============================================================

    static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)

    {

    System.Console.WriteLine("完成,实例编号:{0},状态:{1}", e.InstanceId, e.CompletionState.ToString());

    }

     

    static void aborted(WorkflowApplicationAbortedEventArgs e)

    {

    System.Console.WriteLine("aborted ,实例编号:{1},Reason:{0}", e.Reason.Message, e.InstanceId);

    }

    //==============================================================

     

    #region //CancellationWorkflow 例子

    static void exceptionActivityWorkflow()

    {

    WorkflowApplication instance = new WorkflowApplication(new CancellationWorkflow());

     

    instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);

    instance.OnUnhandledException = unhandledException_Cancel;

    instance.Aborted = aborted;

     

    instance.Run();

    }

     

    static UnhandledExceptionAction unhandledException_Cancel(WorkflowApplicationUnhandledExceptionEventArgs e)

    {

    System.Console.WriteLine("unhandledException_Cancel:{0}", e.UnhandledException.Message);

    return UnhandledExceptionAction.Cancel;

    }

    #endregion

    结果

    1.如果异常出现在[CancellationScope 取消容器],当[UnhandledExceptionAction]方法的返回值为[Cancel],会调用[CancellationScope]的[CancelHandler]部分

    2.完成[CancelHandler]部分后,流程结束.会调用实例的[OnCompleted ]

     

    Parallel中使用 CancellationScope

    在WF4中,可以使用[Parallel] 并行执行多条分支,当[Parallel]中的所有分支都执行完成后,[Parallel]结束.

    可以使用[Pick]实现多条等待分支的单线执行,当一条分支被触发后,其它分支就不会被触发了,当触发的分支完成后,[Pick]结束

    但有时我们会的这样一种需求,我们需要并行执行多条分支,当并行分支中的一条或几条分支满足指定条件时,其它正在执行的分支就不执了.同时,为了保证数据的完整性,我们需要在那些可能要取消的分支中余留一组代码.这组代码用于在该分支被取消后做一些收尾工做

    可以在[Parallel]容器中使用[CancellationScope],当[Parallel]的[CompletionCondition]属性为[True]时,[Parallel]容器会在其内部[CancellationScope]容器执行完成后,结束其它正在执行的并行分支.如果其它正在执行的并行分支是[CancellationScope],则会调用该[CancellationScope]的[CancelHandler]

     

    例子:

    1.在流程中添加bool 型变量[myVariable],默认值False

    2.添加[Parallel],并添加二个CancellationScope分支

    第一个分支:

    [Body]部分:添加[Delay]延时 15秒;添加[WriteLine]打印当"A" 添加[Assign]为变量[myVariable]赋值True

    [CancelHandler]部分:添加[WriteLine]打印当"Cancellation:A取消"

    第二个分支:

    添加[Delay]延时 10秒;添加[WriteLine]打印当"B" ; 添加[Assign]为变量[myVariable]赋值True

    [CancelHandler]部分:添加[WriteLine]打印当"Cancellation:B取消"

    3. 将[Parallel.CompletionCondition ] 绑定到变量[myVariable]

     

    流程

    宿主

     

    //==============================================================

    static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)

    {

    System.Console.WriteLine("完成,实例编号:{0},状态:{1}", e.InstanceId, e.CompletionState.ToString());

    }

     

    static void aborted(WorkflowApplicationAbortedEventArgs e)

    {

    System.Console.WriteLine("aborted ,实例编号:{1},Reason:{0}", e.Reason.Message, e.InstanceId);

    }

     

    static UnhandledExceptionAction unhandledException_Cancel(WorkflowApplicationUnhandledExceptionEventArgs e)

    {

    System.Console.WriteLine("unhandledException_Cancel:{0}", e.UnhandledException.Message);

    return UnhandledExceptionAction.Cancel;

    }

     

    //==============================================================

     

     

    #region //ParallelCancellationWorkflow 例子

     

    static void parallelCancellationWorkflow()

    {

    WorkflowApplication instance = new WorkflowApplication(new ParallelCancellationWorkflow());

     

    instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);

    instance.OnUnhandledException = unhandledException_Cancel;

    instance.Aborted = aborted;

     

    instance.Run();

    }

    #endregion

    结果

     

     

     

  • 相关阅读:
    python--函数的返回值、函数的参数
    python--字典,解包
    Vue--ElementUI实现头部组件和左侧组件效果
    Vue--整体页面布局
    jmeter--non GUI
    python--切片,字符串操作
    celery--调用异步任务的三种方法和task参数
    celery--实现异步任务
    celery--介绍
    开发问题记录
  • 原文地址:https://www.cnblogs.com/foundation/p/1626613.html
Copyright © 2011-2022 走看看