把任务分为前置和后置。
耗时较多的工作放到前置任务里。
最后输出结果通过后置任务输出。
public static void CombTask<T, TR>(List<T> source, Func<T, TR> parallelTask, Action<Task<TR>, T> orderedTask) { int c = 0; for (int i = 0 ; i < source.Count ; i++) { int j = i; Task.Run(() => parallelTask.Invoke(source[j])).ContinueWith(tt => { Exception exception = tt.Exception; while (true) { if (j == c) { try {
if(exception==null) orderedTask?.Invoke(tt, source[j]); } catch (Exception e) { exception = e; }finally{ Interlocked.Increment(ref c);
} break; } } if (exception != null) throw tt.Exception; }); } }
public static void Main() { var list = new List<int>(); for (int i = 0 ; i < 100 ; i++) list.Add(i); var now = DateTime.Now; CombTask(list, j => { Console.WriteLine($"前置任务乱序{j}"); Thread.Sleep(1000); return j; }, (ttt, item) => { Console.WriteLine($"-----------后置任务顺序{item}耗时:{ (DateTime.Now - now).TotalMilliseconds}"); }); Console.ReadKey(); return; }
输出:
前置任务乱序4
前置任务乱序5
前置任务乱序0
前置任务乱序1
前置任务乱序2
前置任务乱序3
前置任务乱序6
前置任务乱序7
前置任务乱序8
-----------后置任务顺序0耗时:1088.0919
-----------后置任务顺序1耗时:1089.0881
-----------后置任务顺序2耗时:1094.0744
-----------后置任务顺序3耗时:1094.0744
-----------后置任务顺序4耗时:1103.0503
-----------后置任务顺序5耗时:1113.0235
-----------后置任务顺序6耗时:1113.0235
-----------后置任务顺序7耗时:1113.0235
前置任务乱序14
前置任务乱序11
前置任务乱序9
前置任务乱序10
前置任务乱序12
前置任务乱序13
前置任务乱序15
前置任务乱序16
前置任务乱序17
-----------后置任务顺序8耗时:2048.9359
前置任务乱序18
-----------后置任务顺序9耗时:2118.775
前置任务乱序19
-----------后置任务顺序10耗时:2119.7734
-----------后置任务顺序11耗时:2120.7701
-----------后置任务顺序12耗时:2121.7702
-----------后置任务顺序13耗时:2122.7646
-----------后置任务顺序14耗时:2122.7646
-----------后置任务顺序15耗时:2123.7619
-----------后置任务顺序16耗时:2123.7619
前置任务乱序26
前置任务乱序25
前置任务乱序23
前置任务乱序20
前置任务乱序22
前置任务乱序24
前置任务乱序21
-----------后置任务顺序17耗时:3047.4016
前置任务乱序28
前置任务乱序27
-----------后置任务顺序18耗时:3052.3879
前置任务乱序29
-----------后置任务顺序19耗时:3120.8844
前置任务乱序30
-----------后置任务顺序20耗时:3131.8537
前置任务乱序31
-----------后置任务顺序21耗时:3139.8324
-----------后置任务顺序22耗时:3139.8324
-----------后置任务顺序23耗时:3139.8324
-----------后置任务顺序24耗时:3140.8308
-----------后置任务顺序25耗时:3143.822
-----------后置任务顺序26耗时:3143.822
前置任务乱序37
前置任务乱序36
前置任务乱序32
前置任务乱序34
前置任务乱序33
前置任务乱序35
前置任务乱序38
-----------后置任务顺序27耗时:4051.1471
-----------后置任务顺序28耗时:4051.1471
前置任务乱序40
前置任务乱序39
-----------后置任务顺序29耗时:4055.0969
前置任务乱序41
-----------后置任务顺序30耗时:4121.9494
前置任务乱序42
-----------后置任务顺序31耗时:4133.9279
前置任务乱序43
-----------后置任务顺序32耗时:4150.8717
前置任务乱序44
-----------后置任务顺序33耗时:4151.8695
-----------后置任务顺序34耗时:4151.8695
前置任务乱序46
前置任务乱序45
-----------后置任务顺序35耗时:4156.857
-----------后置任务顺序36耗时:4159.8533
-----------后置任务顺序37耗时:4162.8405
前置任务乱序48
前置任务乱序49
前置任务乱序47
前置任务乱序50
前置任务乱序51
-----------后置任务顺序38耗时:5047.6206
前置任务乱序52
-----------后置任务顺序39耗时:5052.6092
-----------后置任务顺序40耗时:5052.6092
前置任务乱序54
前置任务乱序53
-----------后置任务顺序41耗时:5056.5943
前置任务乱序55
-----------后置任务顺序42耗时:5123.5963
前置任务乱序56
-----------后置任务顺序43耗时:5135.5646
前置任务乱序57
-----------后置任务顺序44耗时:5152.5186
前置任务乱序58
-----------后置任务顺序45耗时:5159.5023
-----------后置任务顺序46耗时:5160.4979
前置任务乱序60
前置任务乱序59
-----------后置任务顺序47耗时:5169.4766
-----------后置任务顺序48耗时:5172.4889
-----------后置任务顺序49耗时:5173.4657
-----------后置任务顺序50耗时:5174.4612
前置任务乱序64
前置任务乱序61
前置任务乱序62
前置任务乱序63
前置任务乱序65
-----------后置任务顺序51耗时:6047.6064
前置任务乱序66
-----------后置任务顺序52耗时:6049.6032
前置任务乱序67
-----------后置任务顺序53耗时:6058.5831
-----------后置任务顺序54耗时:6060.5776
前置任务乱序68
前置任务乱序69
-----------后置任务顺序55耗时:6061.5823
前置任务乱序70
-----------后置任务顺序56耗时:6125.6625
前置任务乱序71
-----------后置任务顺序57耗时:6138.6207
前置任务乱序72
-----------后置任务顺序58耗时:6154.6286
前置任务乱序73
-----------后置任务顺序59耗时:6172.6141
-----------后置任务顺序60耗时:6172.6141
前置任务乱序75
-----------后置任务顺序61耗时:6177.5679
-----------后置任务顺序62耗时:6179.5653
前置任务乱序77
-----------后置任务顺序63耗时:6181.5667
-----------后置任务顺序64耗时:6186.5444
前置任务乱序79
前置任务乱序76
前置任务乱序74
前置任务乱序78
前置任务乱序80
-----------后置任务顺序65耗时:7047.6286
前置任务乱序81
-----------后置任务顺序66耗时:7049.6242
前置任务乱序82
-----------后置任务顺序67耗时:7050.6198
前置任务乱序83
-----------后置任务顺序68耗时:7065.5816
前置任务乱序84
-----------后置任务顺序69耗时:7070.5667
前置任务乱序85
-----------后置任务顺序70耗时:7071.5629
前置任务乱序86
-----------后置任务顺序71耗时:7129.4229
前置任务乱序87
-----------后置任务顺序72耗时:7139.5269
前置任务乱序88
-----------后置任务顺序73耗时:7157.4748
前置任务乱序89
-----------后置任务顺序74耗时:7193.3757
-----------后置任务顺序75耗时:7193.3757
-----------后置任务顺序76耗时:7195.3747
-----------后置任务顺序77耗时:7197.3607
前置任务乱序93
前置任务乱序92
-----------后置任务顺序78耗时:7200.3525
-----------后置任务顺序79耗时:7200.3525
前置任务乱序95
前置任务乱序90
前置任务乱序94
前置任务乱序91
前置任务乱序96
-----------后置任务顺序80耗时:8048.2657
前置任务乱序97
-----------后置任务顺序81耗时:8049.2653
前置任务乱序98
-----------后置任务顺序82耗时:8052.2639
前置任务乱序99
-----------后置任务顺序83耗时:8055.2477
-----------后置任务顺序84耗时:8067.4492
-----------后置任务顺序85耗时:8071.2033
-----------后置任务顺序86耗时:8075.1947
-----------后置任务顺序87耗时:8132.2958
-----------后置任务顺序88耗时:8142.2718
-----------后置任务顺序89耗时:8162.266
-----------后置任务顺序90耗时:8202.1587
-----------后置任务顺序91耗时:8204.1538
-----------后置任务顺序92耗时:8204.1538
-----------后置任务顺序93耗时:8206.1558
-----------后置任务顺序94耗时:8207.1468
-----------后置任务顺序95耗时:8207.1468
-----------后置任务顺序96耗时:9047.6075
-----------后置任务顺序97耗时:9049.6015
-----------后置任务顺序98耗时:9050.601
-----------后置任务顺序99耗时:9052.6831