看看Parallel中高度封装的三个方法,Invoke,For和ForEach
说到.net中的并行编程,也许你的第一反应就是Task,确实Task是一个非常灵活的用于并行编程的一个专用类,不可否认越灵活的东西用起来就越 复杂,高度封装的东西用起来很简单,但是缺失了灵活性,这篇我们就看看这些好用但灵活性不高的几个并行方法。 一:Invoke 现在电子商务的网站都少不了订单的流程,没有订单的话网站也就没有存活的价值了,往往在订单提交成功后,通常会有这两个操作,第一个:发起 信用卡扣款,第二个:发送emial确认单,这两个操作我们就可以在下单接口调用成功后,因为两个方法是互不干扰的,所以就可以用invoke来玩玩了。 Main(
Console.WriteLine(
Thread.Sleep(
Console.WriteLine(
Console.WriteLine(
Thread.Sleep(
Console.WriteLine( }
? 怎么样,实现起来是不是很简单,只要把你需要的方法塞给invoke就行了,不过在这个方法里面有一个重载参数需要注意下, Invoke(, Action[] actions);
有时候我们的线程可能会跑遍所有的内核,为了提高其他应用程序的稳定性,就要限制参与的内核,正好ParallelOptions提供了 MaxDegreeOfParallelism属性。 好了,下面我们大概翻翻invoke里面的代码实现,发现有几个好玩的地方: <1>: 当invoke中的方法超过10个话,我们发现它走了一个internal可见的ParallelForReplicatingTask的FCL内部专用类,而这个类是继承自 Task的,当方法少于10个的话,才会走常规的Task. <2> 居然发现了一个装exception 的ConcurrentQueue ?????? 比如:throw new AggregateException(exceptionQ); <3> 我们发现,不管是超过10个还是小于10个,都是通过WaitAll来等待所有的执行,所以缺点就在这个地方,
如果我们用task中就可以在waitall中设置一个过期时间,但invoke却没法做到,所以在使用invoke的时候要慎重考虑。
( > || (parallelOptions.MaxDegreeOfParallelism != - && parallelOptions.MaxDegreeOfParallelism < exceptionQ = null;
actionIndex = ParallelForReplicatingTask parallelForReplicatingTask = ParallelForReplicatingTask(parallelOptions,
( l = Interlocked.Increment( actionIndex); l <= actionsCopy.Length; l = Interlocked.Increment(
actionsCopy[l - LazyInitializer.EnsureInitialized |