很好,这次优化将lock次数从6次降到了2次,这里我用了 new ParallelOptions() { MaxDegreeOfParallelism = 2 } 设置了并发度为最多2个CPU核,程序跑起来后会开两个线程,将一个大集合划分为2个小集合,相当于1个集合3个条件,第一个线程在执行3个集合起始处会执行你的localInit函数,在3个集合迭代完之后再执行你的localFinally,第二个线程也是按照同样方式执行自己的3个条件,说的有点晦涩,画一张图说明吧。
三: 第二次优化如果你了解Task<T>这种带有返回值的Task,这就好办了,多少个filterItemList就可以开多少个Task,反正Task底层是使用线程池承载的,所以不用怕,这样就完美的实现无锁编程。
public static void ParallelTest3(List<string> filterItemList) { var totalCustomerIDList = new List<int>(); var tasks = new Task<List<int>>[filterItemList.Count]; for (int i = 0; i < filterItemList.Count; i++) { tasks[i] = Task.Factory.StartNew((query) => { return GetCustomerIDList(query.ToString()); }, filterItemList[i]); } Task.WaitAll(tasks); for (int i = 0; i < tasks.Length; i++) { var smallCustomerIDList = tasks[i].Result; if (i == 0) { totalCustomerIDList.AddRange(smallCustomerIDList); } else { totalCustomerIDList = totalCustomerIDList.Intersect(smallCustomerIDList).ToList(); } } Console.WriteLine($"最后交集客户ID:{string.Join(",", totalCustomerIDList)}"); } ------ output ------- 最后交集客户ID:1,7 Press any key to continue . . . 四:总结我们将原来的6个lock优化到了无锁编程,但并不说明无锁编程就一定比带有lock的效率高,大家要结合自己的使用场景合理的使用和混合搭配。
好了,本篇就说到这里,希望对您有帮助。
如您有更多问题与我互动,扫描下方进来吧~