在.NET4中,另一个新增的抽象线程是Parallel类。这个类定义了并行的for和 foreach的静态方法。在为for和foreach定义的语言中,循环从一个线程中运行。Parallel类使用多个任务,因此使用多个线程来完成这个作业。
Parallel.For()和Paralle1.ForEach()方法多次调用同一个方法,而Parallel.InvokeO方法允许同时调用不同的方法。
1.Parallel.For()方法循环
在For()方法中,前两个参数定义了循环的开头和结束。示例从0迭代到9.第3个参数是一个Action
Parallel.For()方法的返回类型是ParalleLoopResult结构,它提供了循环是否结束的信息。
ParallelLoopResult result = Parallel.For(0, 10, i => {
Console.WriteLine("{0},task:{1},thread:{2}",i,Task.CurrentId,Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(10);
});
Console.WriteLine(result.IsCompleted);
Console.ReadKey();
在ParalleI.ForO的方法体中,把索引、任务标识符和线程标识符写入控制台中。从输出可以看出,顺序是不能保证的。
也可以提前中断Parallel.For方法。Parallel.For方法的一个重载版本接受第3个Action
注意,迭代的顺序没有定义。
ParallelLoopResult result = Parallel.For(0, 10, (int i,ParallelLoopState pls) =>
{
Console.WriteLine("{0},task:{1},thread:{2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(10);
if (i > 5)
pls.Break();
});
Console.WriteLine(result.IsCompleted);
Console.WriteLine(result.LowestBreakIteration);
Console.ReadKey();
Parallel.For方法可能使用几个线程来执行循环。如果需要对每个线程进行初始化,就可以使用Parallel.For
第一个参数的类型是Func
第二个委托参数为循环体定义了委托。在示例中,该参数的类型是Func(int,,ParallelLoopState,string,string)。其中第一个参数是循环迭代,第二个参数ParallelLoopState允许停止循环,如前所述。循环体方法通过第3个参数接收从init方法返回的值,循环体方法还需要返回一个值,其类型是用泛型for参数定义的。
For()方法的最后一个参数指定一个委托Action
2.Parallel.ForEach()方法循环
Parallel.ForEach()方法遍历实现了IEnumerable的集合,其方式类似于foreach语句,但以异步方式遍历。这里也没有确定遍历顺序。
如果需要中断循环,就可以使用ForEachO方法的重载版本和ParallelLoopState参数。其方式与前面的For()方法相同。ForEach()方法的一个重载版本也可以用于访问索引器,从而获得迭代次数,如下所示:
3.Parallel.Invoke()方法调用多个方法
如果多个任务应并行运行,就可以使用Parallel.Invoke()方法。Parallel.Invoke()方法允许传递一个Action委托数组,在其中可以指定应运行的方法。示例代码传递了要并行调用的Foo()和Bar()方法:
static void Main(string[] args)
{
Action a = Foo;
a += Bar;
a += Bar;
a += Bar;
a += Bar;
Parallel.Invoke(a);
Console.ReadKey();
}
static void Foo()
{
Console.WriteLine("foo");
}
static void Bar()
{
Console.WriteLine("Bar");}