博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小心调用Replicator, While 和 CAG子活动
阅读量:6681 次
发布时间:2019-06-25

本文共 2309 字,大约阅读时间需要 7 分钟。

前一阵子基于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 ( ==
null)
    {
         
throw
new ArgumentNullException(
"executionContext"); }
   
  
//开始执行本活动,内部生成一个新的上下文执行环境
      
if (
this.TryNextIteration( ))
       {
          
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)

 

有一部分讲了本文的内容

转载地址:http://wygxo.baihongyu.com/

你可能感兴趣的文章
System.out.println()的含义
查看>>
模仿jquery框架源码---网络
查看>>
php异常处理类
查看>>
UNIX常见命令索引 (echo,find,xargs)
查看>>
第二周(4.23~4.29)
查看>>
spring(5)注解
查看>>
leetcode Isomorphic Strings
查看>>
thinkphp开发系列的U方法的实现-简单实现url
查看>>
ESP&EFP模式win10系统重装(实战WIN10+UEFI引导装系统(不重装不格盘100%成)
查看>>
[BZOJ 1019][SHOI2008]汉诺塔(递推)
查看>>
Codeforces Round #283 (Div. 2) ABCDE
查看>>
cacti安装spine 解决WARNING: Result from CMD not valid. Partial Result: U错误
查看>>
一步步构建大型网站架构
查看>>
(五)hadoop系列之__集群搭建SSH无密访问多台机器
查看>>
node + npm 命令
查看>>
laravel的路由设置,路由参数和路由命名(三)
查看>>
centos7下编译安装php7.3
查看>>
打造 html5 文件上传组件,实现进度显示及拖拽上传,兼容IE6+及其它标准浏览器...
查看>>
(九)Centos之搜索命令whereis、which和字符串搜索命令grep
查看>>
(二十一)JSP基础
查看>>