Replicator与While与任务的CorrelationToken

只有While的情况下

如果一个While,因为While只能包含一个Activity,所以要用一个Sequence包含住CreateTask,OnTaskCreated,,UpdateTask,OnTaskchaged,CompleteTask,DeleteTask,OnTaskDeleted来构成一个任务序列。注意CreateTask是创建任务前动作,他是一个调用外部方法的Activity,因为是MethodInvoking,所以是创建前。OnTaskCreated是创建任务后,它是一个接收外部事件动作,是由宿主(MOSS)触发一个创建完成动作,传递一个消息(包含了任务的参数)给WF运行时,因为是Invoked,所以是创建后。修改Activity类似。所有创建,修改,完成,删除都必须是一个CorrelationToken,因为要用这个CorrelationToken标识任务,如果不同,就会错误,比如创建是A CorrelationToken,修改是B CorrelationToken,那修改时就找不到B CorrelationToken,会报错的。

While创建多个任务时,一定要有CompleteTask或DeleteTask,否则循环多次创建任务时,因为在VS设计环境中创建任务的CorrelationToken是指定好的,如果没有完成或删除任务,那么CorrelationToken还存在所以会报下面错误

中文:HistoryDescription: 已初始化“taskToken”声明的相关值。

英文:HistoryDescription: Correlation value on declaration "taskToken" is already initialized.

当有完成或删除动作,刚才创建的任务的CorrelationToken会自动销毁,也就是不会唯一标示冲突。这个过程是由WhileActivity维护的。

 

如果是Replicator里面套着While

Replicator包含Initialized、ChildInitialized、ChildCompleted、Completed处理程序,这些都是由宿主MOSS触发调用的。

Initialized初始化Replicator,一般定义Replicator是串行还是并行。

ChildInitialized初始化子,创建子Activity

ChildCompleted子Activity完成

Completed全部Replicator完成

While的设计情况不变,但唯一变化的是Replicator内的任务的CorrelationToken是由ReplicatorActivity维护的,也就是只有当跳出While,再次执行ChildInitialized后,While内的任务的CorrelationToken才被销毁,并创建新的CorrelationToken。

所以如果你做了一个含While的自定义的Activty,如果在这个While的子Activity内循环执行创建,就算你完成任务,创建任务也会提示下面错误,因为虽然完成任务,但没有执行ChildInitialized,任务的CollelationToken还在。所以在想Replicator内包含While,While内再包含创建任务来达到创建多个复制的任务是无意义的,因为必须保证跳出While后才能创建任务成功,那如果While内包含创建任务也就达不到目的了。除非保证在While内要再次创建新任务时执行一次ChildInitialized(为了产生不同的CorrelationToke)才不会报错,但现在还没找到方法来这么做。也不要想着在创建任务时用下面代码

    CorrelationToken correlationToken=new CorrelationToken ();
    correlationToken.Name="reassignTaskToken";
    correlationToken.OwnerActivityName="sequenceActivity1";
    createTask1.CorrelationToken=correlationToken;
    onTaskChange1.CorrelationToken=correlationToken;
    completeTask1.CorrelationToken=correlationToken;

来达到产生新的CorrelationToken,因为会产生这个错误:This operation can not be performed at runtime.

中文:HistoryDescription: 已初始化“taskToken”声明的相关值。

英文:HistoryDescription: Correlation value on declaration "taskToken" is already initialized.

 

Parallel类似,其内的任务的CollelationToken是由Parllel自动维护的。只有一个分支执行完,CollelationToken才销毁。

你可能感兴趣的:(while)