使用Parallel 活动:
Parallel 活动是一个组合活动,但它只支持Sequence 活动作为它的子活动。(当然,你可自由地把你想使用的任何活动放到该Sequence 活动中。)它至少需要两个Sequence 活动。
由于Sequence活动并没有在单独的线程上执行,所以Parallel活动并不是一个多线程活动。
下面具体弄个例子来看看Parallel活动的用法:
首先在Visual Studio中建立如下图的一些项目(这些项目在之前已经介绍过怎么做,子此处就不累述了):

现在在VS里找到Workflow1工作流设计视图,在里面添加一些活动。首先添加的就是Parallel 活动,如下图:

接下来的任务就是在俩个Sequence 活动里面各添加俩个Code活动,需添加的一些事件名称和代码如下:


找到ParallelHelloWorld项目,在项目级添加对ParallelFlow的引用,打开program.cs文件,在里面找到下面的一行代码:
Console.WriteLine("Waiting for workflow completion.");
在它下面添加如下代码即完成整个项目:
// Create the workflow instance.
WorkflowInstance instance =
workflowRuntime.CreateWorkflow(typeof(ParallelFlow.Workflow1));
// Start the workflow instance.
instance.Start();
运行该解决方案,你会看到如下图的运行结果:

在上图的运行结果中你会看到结果是乱的,这正是我们需要的结果,因为Parallel 活动是一个并行活动。
使用SynchronizationScope 活动
为了协调并行执行路径,我们下面来介绍下SynchronizationScope活动,它要解决的是同步问题,其作用是完成临界代码区的执行过程及volatile 内存的存取。
当你把一个SynchronizationScope 活动放到你的工作流中的时候,WF 会保证在该执行上下文切换到其它的并行路径以前,该组合活动(指SynchronizationScope 活动)内部的所有活动都将全部运行完成。这意味着你能在SynchronizationScope 内部访问所有的volatile内存和完成临界区代码的执行。
SynchronizationScope 使用的机制和互斥(mutex)相似。
同样我们还是用一个简单的例子来介绍SynchronizationScope活动的使用:我们把SynchronizationScope 活动运用到前面的示例应用程序中,来迫使这些信息以一个恰当的顺序输出。
同样我们在Visual Studio中建立如下图的一些项目:

在解决方案中找到workflow.cs的设计界面,首先添加一个Parallel 活动,然后在Parallel 活动的左右俩边Sequence 活动里各添加一个SynchronizationScope活动。设置SynchronizationScope活动的SynchronizationHandles属性(SynchronizationHandles 其实是一个字符串集合,它们中的每一个字符串的作用是和要进行同步处理的其它的SynchronizationScope 对象建立联)为SyncLock。
备注:你在SynchronizationHandles 属性中输入的文本字符串并不重要。重要的是所有要被同步的SynchronizationScope 活动都要使用相同的文本字符串。
然后在SynchronizationScope 活动里添加一些Code活动,要添加的事件名和代码如下:


在SynchronizedHelloWorld项目里添加对SynchronizedFlow的引用,为了调用工作流同样在program.cs文件添加如下代码:
// Create the workflow instance.
WorkflowInstance instance =
workflowRuntime.CreateWorkflow(typeof(SynchronizedFlow.Workflow1));
// Start the workflow instance.
instance.Start();
编译运行,可以看到如下图的结果:
