System.Threading.Tasks.Parallel类提供了Parallel.Invoke,Parallel.For,Parallel.ForEach这三个静态方法。
1 Parallel.Invoke
尽可能并行执行所提供的每个操作,除非用户取消了操作。
方法:
1)public static void Invoke(params Action[] actions);
2)public static void Invoke(ParallelOptions parallelOptions,
params Action[] actions);
参数:
parallelOptions:一个对象,用于配置此操作的行为。
Actions:要执行的操作数组
异常:
对方法1:
System.ArgumentNullException: actions 参数为 null。
System.AggregateException:当 actions 数组中的任何操作引发异常时引发的异常。
System.ArgumentException:actions数组包含 null 个元素。
对方法2除上述异常外还包括:
System.OperationCanceledException:parallelOptions 设置了System.Threading.CancellationToken。
System.ObjectDisposedException:在 parallelOptions 中与 System.Threading.CancellationToken 关联的System.Threading.CancellationTokenSource已被释放。
说明:
1)Invoke方法只有在actions全部执行完才会返回,即使在执行过程中出现异常也会完成。
2)不能保证actions中的所有操作同时执行。比如actions大小为4,但硬件线程数为2,那么同时运行的操作数最多为2。
3)actions中的操作并行的运行且与顺序无关,若编写与运行顺序有关的并发代码,应选择其他方法。
4)如果使用Invoke加载多个操作,多个操作运行时间迥异,总的运行时间以消耗时间最长操作为基准,这会导致很多逻辑内核长时间处于空闲状态。
5)受限的并行可扩展性,这源于Invoke所调用的委托数目是固定的。
2 Parallel.For
可能会并行运行迭代,可以监视和操作循环的状态。Parallel.For有多个重载的方法,下面列举部分方法。
方法:
1)public static ParallelLoopResult For(int fromInclusive, int toExclusive, Action<int> body);
2)public static ParallelLoopResult For(int fromInclusive, int toExclusive, Action<int, ParallelLoopState> body);
3)public static ParallelLoopResult For(int fromInclusive, int toExclusive, ParallelOptions parallelOptions, Action<int, ParallelLoopState> body);
4)public static ParallelLoopResult For<TLocal>(int fromInclusive, int toExclusive, ParallelOptions parallelOptions, Func<TLocal> localInit, Func<int, ParallelLoopState, TLocal, TLocal> body, Action<TLocal> localFinally);
参数:
fromInclusive:开始索引(含)。
toExclusive:结束索引(不含)。
body:将被每个迭代调用一次的委托。
parallelOptions:一个对象,用于配置此操作的行为。
localInit:一个委托,用于返回每个任务的本地数据的初始状态。
localFinally:一个委托,用于对每个任务的本地状态执行一个最终操作。
返回结果:
ParallelLoopResult :包含有关已完成的循环部分的信息。
异常:
System.ArgumentNullException:body 参数为 null,或 localInit 参数为 null,或 localFinally 参数为 null,或 parallelOptions 参数为 null。 System.AggregateException:包含在所有线程上引发的全部单个异常的异常。
对于方法3)和4)除包含以上异常外还包括:
System.OperationCanceledException:在 parallelOptions 设置了参数 System.Threading.CancellationToken。
System.ObjectDisposedException:在 parallelOptions 中与 System.Threading.CancellationToken 关联的 System.Threading.CancellationTokenSource已被释放。
说明:
1)不支持浮点和步进。
2)无法保证迭代的执行顺序。
3)如果fromInclusive大于或等于toExclusive,方法立即返回而不会执行任何迭代。
4)对于body参数中含有的ParallelLoopState实例,其作用为提早中断并行循环。
5)只有在迭代全部完成以后才会返回结果,否则循环将一直阻塞。
3 Parallel.ForEach
方法
1)public static ParallelLoopResult ForEach(IEnumerable<TSource> source, Action<TSource> body);
2)public static ParallelLoopResult ForEach<TSource>(IEnumerable<TSource> source, ParallelOptions parallelOptions, Action<TSource, ParallelLoopState> body);
3)public static ParallelLoopResult ForEach<TSource>(Partitioner<TSource> source, Action<TSource> body);
参数:
source:数据源
body:将被每个迭代调用一次的委托。
parallelOptions:一个对象,用于配置此操作的行为。
返回结果:
ParallelLoopResult :包含有关已完成的循环部分的信息。
异常:
System.ArgumentNullException:source 参数为 null。-或- 方body 参数为 null。
System.AggregateException:包含了所有线程上引发的全部单个异常。
对于方法2)还包括:
System.OperationCanceledException:在 parallelOptions 设置了参数 System.Threading.CancellationToken。
System.ObjectDisposedException:在 parallelOptions 中与 System.Threading.CancellationToken 关联的 System.Threading.CancellationTokenSource已被释放。
对于3)包括的异常为:
System.Argume