对Activity副本的再理解

     在看本文之前,先看WF大牛WXWinter的博文:http://www.cnblogs.com/foundation/archive/2008/06/05/1214783.html,本人在看他的博文后,觉得还有一些点没有讲透,想通后,写下此文。

     重提一下WXWinter的博文:

     While与Replicator可以重复执行其子Activity,While与Replicator在每次重复使用Activity时,并不是将其重置到初始状态。而是克隆原始Activity,每个克隆的Activity都单独进行管理。不会干扰其他克隆的Activity。这些克隆的Activity每一个都要有自身的 AEC 来管理状态。

     这段描述没有问题,有两点还没说清楚:

     1、克隆的Activity的可见性。

     2、在什么时候克隆Activity。

 

     我们从WXWinter的例二入手,例二没有达到预期目的的根本原因就是克隆的Activity的可见性。

     例一中是在流程中给活动实例的MyProperty属性做++操作的,在流程中只能看到真正的Activity1的活动实例,是不可能看到活动的副本的,所以这里++操作就是针对真正的Activity1的活动实例的。而例二中,由于将给活动实例的MyProperty属性做++操作封到了ActivityLibrary里面,运行时++操作是针对活动的副本进行的,所以根本不会影响到真正的活动实例。

     我们经常要封ActivityLibrary的同志就要注意了,必须使用this.Parent.GetActivityByName(this.Name)才能取到真正的活动实例,GetActivityByName的作用是根据指定的类型名返回当前活动及其子运行活动的活动实例。

     问题二什么时候克隆Activity,在串行情况下,在每次执行序列之前克隆Activity,证据是在副本活动中用一下代码:

     private void codeActivity1_ExecuteCode(object sender, EventArgs e)
        {
            Activity1 a1 = this.Parent.GetActivityByName(this.Name) as Activity1;
            a1.MyProperty++;
            Console.WriteLine(MyProperty);
        }

     可以发现副本的MyProperty值也是变化的。

     在并行情况下就是在最初全部克隆好了。

posted on 2008-07-24 12:21  栖息的熊  阅读(547)  评论(0编辑  收藏  举报

导航