WF4B1 的Procedural Activity 之Sequence,Delay,Pick,PickBranch,Parallel,ForEach,ForEach<T>使用
WF4B1 的Procedural Activity 之Sequence,Delay,Pick,PickBranch,Parallel,ForEach,ForEach<T>使用
目录
1.3.1 Pick 中的 PickBranch是单线执行的 2
Sequence 顺序容器
类名: System.Activities.Statements.Sequence
基类: NativeActivity
文件: System.Activities.dll
类型: sealed
说明: 1.[Activities]集合,可以存放Activity
2.[Activities]集合中的Activity按顺序从上向下执行
3.默认为[顺序工作流]的根容器
Delay 延时
类名: System.Activities.Statements.Delay
基类: NativeActivity ,
接口: System.Activities.IActivityExtensionProvider
文件: System.Activities.dll
类型: sealed
说明: 1.延迟,按指定的时间阻止当前的工作流执行。 持续时间过期后,工作流继续执行
2.[Duration]属性,类型为System.Activities.InArgument<System.TimeSpan>,表示阻止当前的工作流执行的时间
3.不触发[OnIdel]
例
流程 | <p:Activity mc:Ignorable="" x:Class="WorkflowConsoleApplication3.Sequence1" xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities/design" xmlns:__Sequence1="clr-namespace:WorkflowConsoleApplication3;" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:p="http://schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:sad="clr-namespace:System.Activities.Debugger;assembly=System.Activities" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <p:Sequence > <p:WriteLine DisplayName="WriteLine(print:begin+Now)">["begin:" + System.DateTime.Now.ToString()]</p:WriteLine> <p:Delay DisplayName="Delay(10秒)">[New TimeSpan(0, 0, 10)]</p:Delay> <p:WriteLine DisplayName="WriteLine(print:begin+Now)">["end:" + System.DateTime.Now.ToString()]</p:WriteLine> </p:Sequence> </p:Activity> |
宿主 |
WorkflowInstance myInstance = new WorkflowInstance(new Sequence1());
myInstance.Run();
System.Console.Read(); |
结果 |
Pick 与 PickBranch
类名: System.Activities.Statements.Pick
基类: NativeActivity
文件: System.Activities.dll
类型: sealed
说明: 1.[Pick]触发容器,提供了基于事件的控制流。
2.[Branches]集合的类型为[System.Collections.ObjectModel.Collection<System.Activities.Statements.PickBranch>]
是子控件集合, 只能添加[PickBranch]
类名: System.Activities.Statements.PickBranch
基类: object
文件: System.Activities.dll
类型: sealed
说明: 1.[Pick]触发容器的分支。 [PickBranch] 只可添加到[Pick]中
2.[Trigger] 属性,只能放入触发类Activity
3.[Action] 当[Trigger] 被触发时,所要执行的Activity
Pick 中的 PickBranch是单线执行的
1. 只要有一个[PickBranch]的[Trigger]被触发,其他[PickBranch]就不会被触发了
2. 即使在被执行的[PickBranch]还没完成时,其他[PickBranch]也不会被触发
例
流程 | <p:Activity mc:Ignorable="" x:Class="WorkflowConsoleApplication3.Sequence1" xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities/design" xmlns:__Sequence1="clr-namespace:WorkflowConsoleApplication3;" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:p="http://schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:sad="clr-namespace:System.Activities.Debugger;assembly=System.Activities" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <p:Sequence > <p:WriteLine>["begin"]</p:WriteLine> <p:Pick> <p:PickBranch> <p:PickBranch.Trigger> <p:Delay>[New TimeSpan(0, 0, 10)]</p:Delay> </p:PickBranch.Trigger> <p:WriteLine>["10"]</p:WriteLine> </p:PickBranch> <p:PickBranch> <p:PickBranch.Trigger> <p:Delay>[New TimeSpan(0, 0, 5)]</p:Delay> </p:PickBranch.Trigger> <p:WriteLine>["5"]</p:WriteLine> </p:PickBranch> </p:Pick> <p:WriteLine>["end"]</p:WriteLine> </p:Sequence> </p:Activity> |
宿主 | WorkflowInstance myInstance = new WorkflowInstance(new Sequence1()); myInstance.Run(); System.Console.Read(); |
结果 |
Parallel 并行容器
类名: System.Activities.Statements.Parallel
基类: object
文件: System.Activities.dll
类型: sealed
说明: 1.[Branches]集合的类型为System.Collections.ObjectModel.Collection<System.Activities.WorkflowElement>,容器会并行执行容器内的所有Activity
2.[CompletionCondition] 属性[System.Activities.WorkflowElement<bool>],当[ CompletionCondition 属性]为真时,完成
例
流程 | <p:Activity mc:Ignorable="" x:Class="WorkflowConsoleApplication3.Sequence1" xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities/design" xmlns:__Sequence1="clr-namespace:WorkflowConsoleApplication3;" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:p="http://schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:sad="clr-namespace:System.Activities.Debugger;assembly=System.Activities" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <p:Sequence > <p:WriteLine DisplayName="WriteLine(print:begin+Now)">["begin:" + System.DateTime.Now.ToString()]</p:WriteLine> <p:Parallel> <p:Sequence> <p:Delay DisplayName="Delay(10秒)">[New TimeSpan(0, 0, 10)]</p:Delay> <p:WriteLine DisplayName="WriteLine(print:"A")">["A"]</p:WriteLine> </p:Sequence> <p:Sequence> <p:Delay DisplayName="Delay(15秒)">[New TimeSpan(0, 0, 15)]</p:Delay> <p:WriteLine DisplayName="WriteLine(print:"B")">["B"]</p:WriteLine> </p:Sequence> </p:Parallel> <p:WriteLine DisplayName="WriteLine(print:begin+Now)">["end:" + System.DateTime.Now.ToString()]</p:WriteLine> </p:Sequence> </p:Activity> |
宿主 | WorkflowInstance myInstance = new WorkflowInstance(new Sequence1()); myInstance.Run(); System.Console.Read(); |
结果 |
ForEach 循环
类名: System.Activities.Statements.ForEach
基类: NativeActivity
文件: System.Activities.dll
类型: sealed
说明: 1.循环[Values]属性所指定的集合中的值,[Values]属性可指定到[object]对象上
2.可在[ForEach]内部添加[Activity]用以操作循环的[item],只能添加一个[Activity],[Activity]内部的子[Activity]也可访问[item]
3.使用[ForEach]时,内部[item]在表达式输入框中为[object]类型,可以使用[ForEach<T>],这样内部[item]在表达式输入框中为<T>
Values属性
有时设不上,要到xaml中手写
<p:Activity mc:Ignorable="" x:Class="WorkflowConsoleApplication5.Sequence1" xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities/design"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:p="http://schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:sad="clr-namespace:System.Activities.Debugger;assembly=System.Activities" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:scg="clr-namespace:System.Collections.Generic;assembly=mscorlib"
> <x:Members> <x:Property Name="myInputCollection" Type="p:InArgument(scg:IEnumerable(x:String))" /> </x:Members>
<p:Sequence> <p:ForEach Values="[myInputCollection]"> <p:ActivityAction x:TypeArguments="s:Object"> <p:ActivityAction.Argument> <p:Variable x:TypeArguments="s:Object" Name="item" /> </p:ActivityAction.Argument> <p:WriteLine>[item]</p:WriteLine> </p:ActivityAction> </p:ForEach> </p:Sequence> </p:Activity> |
例
流程 | <p:Activity mc:Ignorable="" x:Class="WorkflowConsoleApplication5.Sequence1" xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities/design"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:p="http://schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:sad="clr-namespace:System.Activities.Debugger;assembly=System.Activities" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:scg="clr-namespace:System.Collections.Generic;assembly=mscorlib" > <x:Members> <x:Property Name="myInputCollection" Type="p:InArgument(scg:IEnumerable(x:String))" /> </x:Members>
<p:Sequence> <p:ForEach Values="[myInputCollection]"> <p:ActivityAction x:TypeArguments="s:Object"> <p:ActivityAction.Argument> <p:Variable x:TypeArguments="s:Object" Name="item" /> </p:ActivityAction.Argument> <p:WriteLine>[item]</p:WriteLine> </p:ActivityAction> </p:ForEach> </p:Sequence> </p:Activity> |
宿主 | Dictionary<string, object> inputCollection = new Dictionary<string, object>();
List<string> list = new List<string>();
list.Add("wxd"); list.Add("lzm"); list.Add("wxwinter");
inputCollection.Add("myInputCollection", list );
WorkflowInstance myInstance = new WorkflowInstance(new Sequence1(), inputCollection);
myInstance.Run();
System.Console.Read(); |
结果 |
ForEach<T> 循环
类名: System.Activities.Statements.ForEach<T>
基类: NativeActivity
文件: System.Activities.dll
类型: sealed
说明: 1.与[ForEach]不同的是,内部[item]在表达式输入框中为<T>
2.在添加[ForEach<T>]时,需要为内部[item]指定类型
3.其他使用与[ForEach]相同
例
流程 | <p:Activity mc:Ignorable="" x:Class="WorkflowConsoleApplication5.Sequence1" xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities/design" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:p="http://schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:sad="clr-namespace:System.Activities.Debugger;assembly=System.Activities" xmlns:w="clr-namespace:WorkflowConsoleApplication5;assembly=WorkflowConsoleApplication5" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <x:Members> <x:Property Name="myInputCollection" Type="p:InArgument(s:Object)" /> </x:Members> <p:Sequence> <p:ForEach x:TypeArguments="w:myType" Values="[myInputCollection]"> <p:ActivityAction x:TypeArguments="w:myType"> <p:ActivityAction.Argument> <p:Variable x:TypeArguments="w:myType" Name="item" /> </p:ActivityAction.Argument> <p:WriteLine>[item.myValue]</p:WriteLine> </p:ActivityAction> </p:ForEach> </p:Sequence> </p:Activity> |
宿主 | Dictionary<string, object> inputCollection = new Dictionary<string, object>();
List<string> list = new List<string>();
list.Add("wxd"); list.Add("lzm"); list.Add("wxwinter");
inputCollection.Add("myInputCollection", list );
WorkflowInstance myInstance = new WorkflowInstance(new Sequence1(), inputCollection);
myInstance.Run();
System.Console.Read(); |
结果 |