前一阵子基于WWF开发时,在WhileActivity中放置了一个自定义的审核活动A1,基于审核结果A1.Approved作为执行条件。但是每次A1.Approved的值都是false。我在程序中设置断点,在执行期间查看了A1的Approved为True,但是第二次执行时又为false了。

这就是我们在这类具有回转功能的复合活动时需要注意的问题,否则很可能你的代码不跟着你的感觉走了,下面我讲一些出现这种情况的原因,以及如何开发这类应用。

使用工具Reflector查看System.Workflow.Activities的WhileActivity代码。

//活动执行时执行的代码,ActivityExecutionContext 为活动执行的上下文信息
protected override ActivityExecutionContext Execute(ActivityExecutionContext executionContext)
{
    if (executionContext == null)
{
throw new ArgumentNullException("executionContext"); }
   //开始执行本活动,内部生成一个新的上下文执行环境
if (this.TryNextIteration(executionContext))
{
return ActivityExecutionStatus.Executing;
}
return ActivityExecutionStatus.Closed;
}

private bool TryNextIteration(ActivityExecutionContext context)
{
...
  if (base.EnabledActivities.Count > 0)
  { 
   //内部生成一个执行上下文,子活动上下文中基于WhileActivity中放置的活动来生成子活动
     ActivityExecutionContext context1 = context.ExecutionContextManager.CreateExecutionContext(base.EnabledActivities[0]);
     context1.Activity.RegisterForStatusChange(Activity.ClosedEvent, this);
     context1.ExecuteActivity(context1.Activity);
  }
  return true;
}

在WWF中有个重要的概念:在具有多次执行子活动的复合活动内部执行时生成克隆的执行上下文

在WWF中提供了 Replicator, While 和 CAG可以多次执行子活动。WF内部给每次执行重新生成一个ActivityExecutionContext ,这样就比较容易处理补偿操作吧。

ActivityExecutionContext作为Execute, Cancel, HandleFault等参数,也通过sender (QueueItemAvailable handler, StatusChanged handler)传递。 ActivityExecutionContext提供控制Activity的接口。

 ActivityExecutionContext( activity){. = ;}

每个context都有一个root activity,而且只有在context中的activities才能在当前上下文执行。

当子活动需要多次执行时,ActivityExecutionContext childContext = currentContext.ExecutionContextManager.CreateExecutionContext(reviewActivity);

执行代码将生成一个新的上下文,树型结构表示成:

RootContext
|      whileActivity (1)
|         reviewActivity (1)
- childContext(reviewer=张三)
|         reviewActivity (2)

- childContext(reviewer=李四)
|         reviewActivity (3)

whileActivity (1)和reviewActivity (1)是我们在workflow的Activities中添加的

活动,reviewActivity (2)和reviewActivity (3)是基于reviewActivity (1)模板生成活动。由于审核活动加入工作流时默认Approved为false,所以不管这个活动在while中执行多少次或者审核结果是否通过,每次执行时获取当前上下文的审核活动的Approved都是false。可以把reviewActivity (2)和reviewActivity (3)想象成reviewActivity (1)的实例。

我们可以通过在工作流中设置一个变量来解决传递审核结果的问题。

在上面这个例子中,reviewActivity (2)和reviewActivity (3)实例之间互不影响,whileActivity.Activities[0]将总是 reviewActivity (1),reviewActivity (3)
.Parent.Activities[0]也是reviewActivity (1)

链接有一部分讲了本文的内容

转载于:https://www.cnblogs.com/zhoujg/archive/2006/03/22/356288.html

小心调用Replicator, While 和 CAG子活动相关推荐

  1. ecshop调用指定分类(包含子分类)下所有产品的评论信息

    调用指定分类(包含子分类)下所有产品的评论信息,使用了ecshop系统自带的函数get_children($cat_id)调用指定分类下所有子分类的id,该自带函数在文件include/lib_com ...

  2. phpcms调用全部频道栏目及子栏目代码详解

    经常有朋友在做模板的时候,需要用到调用栏目及其子栏目,增强网站的用户体验! 以下提供的调用全部频道栏目及子栏目的代码加入到模板中的对应位置即可! {loop $CATEGORY $catid $cat ...

  3. destoon实现调用当前栏目分类及子分类和三级分类的方法

    destoon实现调用当前栏目分类及子分类和三级分类的方法: 调用当前栏目分类及子分类和三级分类是程序设计里常用的方法,本文就来详细讲述destoon实现调用当前栏目分类及子分类和三级分类的方法.具体 ...

  4. 帆软报表 js 调用sql_SQL Server中的报表–创建由先前创建的主报表调用的基于矩阵的子报表

    帆软报表 js 调用sql Introduction 介绍 As you will remember from our last "get together" we created ...

  5. html怎么设置子页,京东移动端新建的自定义页面如何装修?无线端设置二级子活动页面图文演示...

    京东店铺装修手机端如何添加自定义页面?京东自定义页面怎么自定义代码装修?JD二级页面怎么做自定义模块装修?无线端怎么新建一个页面做为活动页面,京东手机店铺越来越多人注重装修了,如果手机移动端首页装修完 ...

  6. C# 如何重复调用父窗体中的子窗体

    当我们在父窗体中点击一个按钮,会出现一个子窗体,又或者当点击另一个标签,也会弹出与之前相同的子窗体.要保证两次点击弹出的是一个窗体,要使用以下的方法,注意弹出窗体的时候不能用ShowDialog方法, ...

  7. 如何:创建 MDI 父窗体、子窗体、确定活动的 MDI 子窗体

    Microsoft Visual Studio 2008/.NET Framework 3.5 Windows 窗体编程 如何:创建 MDI 父窗体 多文档界面 (MDI) 应用程序的基础是 MDI ...

  8. Vue中ref的用法:获取DOM 父获取子数据 父使用子方法 子调用父方法

    获取本页面dom元素 <template><div id="app"><div ref="testDom">11111< ...

  9. Labview子VI的创建与调用

    LabVIEW专栏:https://blog.csdn.net/weixin_44543463/category_10714833.html 本文目录 一.什么是子VI 二.子VI的创建与调用 2.1 ...

最新文章

  1. html树状结构怎么展开,纯css实现树形结构
  2. 将简历挂到云服务器网站上记
  3. 列表是否包含简短的包含功能?
  4. linux 内核函数 copy_from_user和copy_to_user 介绍
  5. 推送通知服务【WP7学习札记之十三】
  6. 图像分割之(六)交叉视觉皮质模型(ICM)
  7. 【CV】基于聚类的图像分割-Python
  8. MY MOBILER v1.23 - 类似SOTI Pocket Controller的免费工具
  9. python装饰器传递参数_如何将额外的参数传递给Python装饰器?
  10. [Silverlight]奇技银巧系列-5 捕获路由事件
  11. mysql读写分离和分布式_MySQL主从复制与读写分离
  12. Servlet文件上传功能的实现(commons-fileupload)
  13. c语言到底写什么系统,用C语言写关于操作系统的一个问题。
  14. 什么?程序员还要了解经济学?! 1
  15. 官网链接下载QT5 Creator
  16. JavaScript 销毁对象
  17. react中的 .d.ts
  18. 关于vue的组件重新加载
  19. springboot+vue+安卓二手交易平台源码
  20. 梯度下降算法原理 神经网络(Gradient Descent)

热门文章

  1. php 7 中对数值 * 100 出现很多小数_PHP快速入门第二讲:数据类型
  2. 将一张100元按如下要求C语言,aoa三一宝典(计算机二级考试)
  3. 土豆 android 缓存路径,#土豆记事#教你开发Android App之 —— Hello Android
  4. oracle進程時高時低,oracle低權限下獲取shell
  5. 怎么删除用户_小米手机如何恢复最近删除的便签 - 学显
  6. tcpip详解有必要看吗_车辆有必要安装“行车记录仪”吗?如何挑选看这里!
  7. 如何检查CentOS版本– 8种方法
  8. 14-9-25日jenkins部署到tomcat的错误日志
  9. C语言基础教程之强制类型转换
  10. Java基础篇之什么是类集?