WF4.0 基础篇 (九) 控制流Activity

本节主要介绍Parallel,Pick,PickBranch,ParallelForEach<T> 的使用.

 

本文例子下载:

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

本文例子说明

控制流Activity

Parallel 并行容器

类名

System.Activities.Statements.Parallel

文件

System.Activities.dll

结构说明

继承 NativeActivity

是一个 sealed类

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

[CompletionCondition]属性的类型为[ Activity<bool> ],可以接受一个结果为[bool]的表达式

[Branches] 属性 的类型为[Collection<Activity>],是并行分支集合

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

功能说明

[Parallel]中可以定义变量

[Parallel]会并行执行[Branches] 集合内的所有Activity

当[ CompletionCondition 属性]为真时,并行容器完成,其他没的执行完成的分支就不再执行了(包括执行一半的分支)

 

例:基本使用

1.在流程中添加[WriteLine]打印当前时间

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

第一个分支添加[Delay]延时 10秒, 添加[WriteLine]打印当"A"

第二个分支添加[Delay]延时 15秒, 添加[WriteLine]打印当"B"

3.在流程中添加[WriteLine]打印当前时间

 

预期:两次的系统时间差为15秒表示为并行, 两次的系统时间差为25秒表示为串行

 

流程

宿主

 

WorkflowInvoker.Invoke(new ParallelWorkflow());

结果

 

例:CompletionCondition 说明

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

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

第一个分支: 添加[WriteLine]打印当"A1" ;添加[Delay]延时 10秒;添加[WriteLine]打印当"A2"

第二个分支: 添加[WriteLine]打印当"B1" ;添加[Delay]延时 15秒;添加[WriteLine]打印当"B2" ; 添加[Assign]为变量[myVariable]赋值True

第三个分支: 添加[WriteLine]打印当"C1" ;添加[Delay]延时 20秒;添加[WriteLine]打印当"C2"

 

预期: [Assign]为变量[myVariable]赋值True后,容器结束,因此会依次看到[A1,B1,C1,A2,B2],但看不到[C2]

 

流程

宿主

 

WorkflowInvoker.Invoke(new ParallelCompletionConditionWorkflow());

结果

 

Pick,PickBranch 触发容器

Pick

类名

System.Activities.Statements.Pick

文件

System.Activities.dll

结构说明

继承 NativeActivity

是一个 sealed类

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

override 了 [CanInduceIdle]属性

[Branches ] 属性 的类型为[ Collection<PickBranch> ]

PickBranch

类名

System.Activities.Statements. PickBranch

文件

System.Activities.dll

结构说明

继承 Object

是一个 sealed类

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

[DisplayName] 属性 的类型为[string]

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

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

 

功能说明

1. [Pick]触发容器,提供了基于事件的控制流。 [Branches]集合是触发容器的分支集合,只能添加[PickBranch]

2. [Pick]触发容器中可以定义变量

3. [PickBranch] 只可添加到[Pick]中,[PickBranch.Trigger]只能放入触发类Activity,[PickBranch.Action] 当[PickBranch.Trigger] 被触发时,所要执行的Activity

4.只要有一个[PickBranch][Trigger]被触发,其他[PickBranch]就不会被触发了

5.即使在被执行的[PickBranch]还没完成时,其他[PickBranch]也不会被触发

 

 

例:基本使用

1.在工作流中添加[WriteLine],打印系统时间

2.在工作流中添加[Pick],添加三个[PickBranch]

第一个分支: [Trigger]添加[Delay]延时 15秒

[Action]添加[WriteLine]打印当"A"

第二个分支: [Trigger]添加[Delay]延时 10秒

[Action]添加[WriteLine]打印当"B1"

添加[Delay]延时 15秒

添加[WriteLine]打印当"B2"

第三个分支: [Trigger]添加[Delay]延时 20秒

[Action]添加[WriteLine]打印当"C"

 

预期:只有第二个分支会被执行

 

流程

宿主

 

WorkflowInvoker.Invoke(new PickWorkflow());

结果

 

 

ParallelForEach<T> 循环

类名

System.Activities.Statements.ParallelForEach<T>

文件

System.Activities.dll

结构说明

继承 NativeActivity

是一个 sealed类

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

[CompletionCondition]属性的类型为[ Activity<bool> ],可以接受一个结果为[bool]的表达式

[Body] 属性 的类型为[ActivityAction<T>]

[Values] 属性 的类型为[ InArgument<IEnumerable<T>> ]

功能说明

[Values] 属性为要循环的集合

[TypeArgument] 为要循环集合的的类型

[item]为循环时的临时变量,可在[Body]中被访问

每个迭代完成后,检查[ CompletionCondition 属性],为真时,完成

 

例:基本使用

1. 创建一code activity 名为[CollectionActivity],

具有[Out]参数,类型为List<string>的参数[myOutCollection]

2. 在流程中添加List<string>变量[myCollection]

3. 在流程中添加[CollectionActivity],将[CollectionActivity.myOutCollection]参数绑定到 [myCollection] 变量

4. 在流程中添加[ForEach<T>],[TypeArgument]属性指定[string]

[Values] 属性绑定到 [myCollection] 变量

在[Body]中添加[writeLine],打印[item]

 

CollectionActivity

public sealed class CollectionActivity : CodeActivity

{

public OutArgument<System.Collections.Generic.List<string>> myOutCollection { get; set; }

protected override void Execute(CodeActivityContext context)

{

System.Collections.Generic.List<string> list = new List<string>();

list.Add("wxd");

list.Add("lzm");

list.Add("wxwinter");

 

context.SetValue (this.myOutCollection,list );

}

}

流程

宿主

 

WorkflowInvoker.Invoke(new ParallelForEachWorkflow());

结果

 

 

 

 

posted @   WXWinter(冬)  阅读(13680)  评论(32编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示