使用 ReplicatorActivity 活动可以在运行时创建单个活动的任意多个实例。 每个 ReplicatorActivity 活动都只能包含一个子活动,但该子活动可以是复合活动。
默认情况下,ReplicatorActivity 活动在所有子活动都已完成时完成。 您可以使用 UntilCondition 属性,在子活动实例完成之前停止执行 ReplicatorActivity。
ReplicatorActivity 需要两条关键信息:
ExecutionType 属性必须设置为 Sequential 或 Parallel。 ExecutionType 属性指示复制的子活动实例是以并行方式还是顺序方式执行。如果是以并行方式执行,则将在 ReplicatorActivity 活动执行时创建所有实例;如果是以顺序方式执行,则将依次执行子活动的每个实例,即:前一个实例完成后再执行下一个实例。
必须填充 InitialChildData 集合属性,以便为子活动的每个复制实例提供数据。
可以实现在 ReplicatorActivity 开始执行之前引发的 Initialized 处理程序,以填充 InitialChildData 集合属性并设置 ExecutionType。
还可以指定使以下事件可以与 ReplicatorActivity 活动一起使用的处理程序:
ChildInitialized 事件在每次初始化子活动的实例时都会引发,它将 InitialChildData 集合的该项中的数据传递给要初始化的子活动的实际实例。ReplicatorChildEventArgs 包含该处理程序的事件参数。
每当子活动的实例完成时都会引发的 ChildCompleted 事件。ReplicatorChildEventArgs 包含此处理程序的事件参数。
在 ReplicatorActivity 完成后引发的 Completed 事件。
当子活动执行多次时,会为每次迭代创建子活动的一个单独实例。 这样便可以单独执行实例(对于 ConditionedActivityGroup 活动,可能会以并行方式执行实例)。 因此,活动树(称为模板)中的活动的定义永远不会执行,并总是处于 Initialized 状态。 对模板的运行实例的访问由作为模板父级的复合活动提供。 例如,对于 ReplicatorActivity 活动,可能存在多个活动的实例,从而使得 ReplicatorActivity.DynamicActivities 返回子活动的运行实例的集合。
首先拖进一个Replicator 和 一个Code活动到wrokflow1.cs
然后向其中添加如下代码:
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Drawing;
using System.Linq;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;
namespace WorkflowConsoleApplication2
{
public sealed partial class Workflow1 : SequentialWorkflowActivity
{
private String vote;
private int countAll = 0;
private String result = String.Empty;
private ArrayList array;
public int CountAll
{
get { return countAll; }
}
public String Result
{
get { return result; }
}
public ArrayList ArrayL
{
get { return array; }
set { array = value; }
}
public Workflow1()
{
InitializeComponent();
}
private void replicatorActivity1_Initialized(object sender, EventArgs e)
{
this.replicatorActivity1.InitialChildData = array;
}
private void codeActivity1_ExecuteCode(object sender, EventArgs e)
{
countAll++;
}
private void replicatorActivity1_ChildInitialized(object sender, ReplicatorChildEventArgs e)
{
vote = e.InstanceData as String;
vote = "您给" + vote + "投了票";
System.Console.WriteLine(vote);
}
private void replicatorActivity1_ChildCompleted(object sender, ReplicatorChildEventArgs e)
{
result = result + "\n" + vote;
System.Console.WriteLine("completed" + countAll);
}
private void replicatorActivity1_Completed(object sender, EventArgs e)
{
System.Console.WriteLine("all completed");
}
}
}
将Program.cs中的代码修改如下:
using System.Linq;
using System.Text;
using System.Threading;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;
using System.Collections;
namespace WorkflowConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
{
AutoResetEvent waitHandle = new AutoResetEvent(false);
workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) {waitHandle.Set();};
workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
{
Console.WriteLine(e.Exception.Message);
waitHandle.Set();
};
[b] Dictionary<string, object> dic = new Dictionary<string, object>();
ArrayList list = new ArrayList();
list.Add("chenyuan");
list.Add("yuanchen");
dic.Add("ArrayL",list);
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WorkflowConsoleApplication2.Workflow1),dic);[/b]
instance.Start();
waitHandle.WaitOne();
}
}
}
}
默认情况下,ReplicatorActivity 活动在所有子活动都已完成时完成。 您可以使用 UntilCondition 属性,在子活动实例完成之前停止执行 ReplicatorActivity。
ReplicatorActivity 需要两条关键信息:
ExecutionType 属性必须设置为 Sequential 或 Parallel。 ExecutionType 属性指示复制的子活动实例是以并行方式还是顺序方式执行。如果是以并行方式执行,则将在 ReplicatorActivity 活动执行时创建所有实例;如果是以顺序方式执行,则将依次执行子活动的每个实例,即:前一个实例完成后再执行下一个实例。
必须填充 InitialChildData 集合属性,以便为子活动的每个复制实例提供数据。
可以实现在 ReplicatorActivity 开始执行之前引发的 Initialized 处理程序,以填充 InitialChildData 集合属性并设置 ExecutionType。
还可以指定使以下事件可以与 ReplicatorActivity 活动一起使用的处理程序:
ChildInitialized 事件在每次初始化子活动的实例时都会引发,它将 InitialChildData 集合的该项中的数据传递给要初始化的子活动的实际实例。ReplicatorChildEventArgs 包含该处理程序的事件参数。
每当子活动的实例完成时都会引发的 ChildCompleted 事件。ReplicatorChildEventArgs 包含此处理程序的事件参数。
在 ReplicatorActivity 完成后引发的 Completed 事件。
当子活动执行多次时,会为每次迭代创建子活动的一个单独实例。 这样便可以单独执行实例(对于 ConditionedActivityGroup 活动,可能会以并行方式执行实例)。 因此,活动树(称为模板)中的活动的定义永远不会执行,并总是处于 Initialized 状态。 对模板的运行实例的访问由作为模板父级的复合活动提供。 例如,对于 ReplicatorActivity 活动,可能存在多个活动的实例,从而使得 ReplicatorActivity.DynamicActivities 返回子活动的运行实例的集合。
首先拖进一个Replicator 和 一个Code活动到wrokflow1.cs
然后向其中添加如下代码:
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Drawing;
using System.Linq;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;
namespace WorkflowConsoleApplication2
{
public sealed partial class Workflow1 : SequentialWorkflowActivity
{
private String vote;
private int countAll = 0;
private String result = String.Empty;
private ArrayList array;
public int CountAll
{
get { return countAll; }
}
public String Result
{
get { return result; }
}
public ArrayList ArrayL
{
get { return array; }
set { array = value; }
}
public Workflow1()
{
InitializeComponent();
}
private void replicatorActivity1_Initialized(object sender, EventArgs e)
{
this.replicatorActivity1.InitialChildData = array;
}
private void codeActivity1_ExecuteCode(object sender, EventArgs e)
{
countAll++;
}
private void replicatorActivity1_ChildInitialized(object sender, ReplicatorChildEventArgs e)
{
vote = e.InstanceData as String;
vote = "您给" + vote + "投了票";
System.Console.WriteLine(vote);
}
private void replicatorActivity1_ChildCompleted(object sender, ReplicatorChildEventArgs e)
{
result = result + "\n" + vote;
System.Console.WriteLine("completed" + countAll);
}
private void replicatorActivity1_Completed(object sender, EventArgs e)
{
System.Console.WriteLine("all completed");
}
}
}
将Program.cs中的代码修改如下:
using System.Linq;
using System.Text;
using System.Threading;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;
using System.Collections;
namespace WorkflowConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
{
AutoResetEvent waitHandle = new AutoResetEvent(false);
workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) {waitHandle.Set();};
workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
{
Console.WriteLine(e.Exception.Message);
waitHandle.Set();
};
[b] Dictionary<string, object> dic = new Dictionary<string, object>();
ArrayList list = new ArrayList();
list.Add("chenyuan");
list.Add("yuanchen");
dic.Add("ArrayL",list);
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WorkflowConsoleApplication2.Workflow1),dic);[/b]
instance.Start();
waitHandle.WaitOne();
}
}
}
}