说到.net中的并行编程,也许你的第一反应就是Task,确实Task是一个非常灵活的用于并行编程的一个专用类,不可否认越灵活的东西用起来就越
复杂,高度封装的东西用起来很简单,但是缺失了灵活性,这篇我们就看看这些好用但灵活性不高的几个并行方法。
一:Invoke
现在电子商务的网站都少不了订单的流程,没有订单的话网站也就没有存活的价值了,往往在订单提交成功后,通常会有这两个操作,第一个:发起
信用卡扣款,第二个:发送emial确认单,这两个操作我们就可以在下单接口调用成功后,因为两个方法是互不干扰的,所以就可以用invoke来玩玩了。
1 static void Main(string[] args)2 {3 Parallel.Invoke(Credit, Email);4
5 Console.Read();6 }7
8 static voidCredit()9 {10 Console.WriteLine("****************** 发起信用卡扣款中 ******************");11
12 Thread.Sleep(2000);13
14 Console.WriteLine("扣款成功!");15 }16
17 static voidEmail()18 {19 Console.WriteLine("****************** 发送邮件确认单!*****************");20
21 Thread.Sleep(3000);22
23 Console.WriteLine("email发送成功!");24 }
怎么样,实现起来是不是很简单,只要把你需要的方法塞给invoke就行了,不过在这个方法里面有一个重载参数需要注意下,
1 public static void Invoke(ParallelOptions parallelOptions, params Action[] actions);
有时候我们的线程可能会跑遍所有的内核,为了提高其他应用程序的稳定性,就要限制参与的内核,正好ParallelOptions提供了
MaxDegreeOfParallelism属性。
好了,下面我们大概翻翻invoke里面的代码实现,发现有几个好玩的地方:
<1>: 当invoke中的方法超过10个话,我们发现它走了一个internal可见的ParallelForReplicatingTask的FCL内部专用类,而这个类是继承自
Task的,当方法少于10个的话,才会走常规的Task.
<2> 居然发现了一个装exception 的ConcurrentQueue队列集合,多个异常入队后,再包装成AggregateException抛出来。
比如:throw new AggregateException(exceptionQ);
<3> 我们发