首页 > 解决方案 > Looped Parallel.For 没有给出预期的结果

问题描述

我正在另一个 Parallel.For 循环中测试 Parallel.For 循环。结果预计是从 1 到 500 递增 1 个单位的数字。但输出始终是这样的:

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

53
54
55
56
57

59

61
62
63
64
65

67
68
69

71

73
74
75
76
77

79
80
81

83
84
85
86
87

89
90
91
92
93
94
95

97
98
99

101

103
104


107

109
110
111

113
114
115
116

118
119


122
123
124
125

127
128
129

131
132

134
135

137

139
140


143
144

146
147

149

151
152
153
154
155



159
160
161

163
164


167

169
170
171

173
174
175



179

181

183
184
185

187
188
189

191


194
195

197

199


202
203
204

206
207

209




214
215
216


219

221

223
224


227

229
230
231

233
234


237

239


242

244
245

247

249

251



255

257
258
259
260


263

265



269

271
272


275


278
279

281




286
287

289



293

295
296


299
300


303

305

307

309

311


314




319

321

323



327
328
329


332


335



339

341
342
343





349
350
351







359







367
368
369





375

377

379



383


386


389

391



395



399




404




409



413





419


422






429

431







439
440








449









459









469









479









489









499

如您所见,缺少一些东西...我为此编写了小程序。所以这里是:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Web;

namespace testProjectCSharp
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] numbersFromParallel = new string[500];

            ParallelOptions option1 = new ParallelOptions();
            option1.MaxDegreeOfParallelism = 10;
            ParallelOptions option2 = new ParallelOptions();
            option2.MaxDegreeOfParallelism = 10;

            Parallel.For(1, 51, option1, i =>
            {
                Parallel.For(1, 11, option2, g =>
                {
                    numbersFromParallel[(i * g) - 1] = ((i * g) - 1).ToString();
                });
            });

            File.WriteAllLines(@"C:\tempArrayTest.txt", numbersFromParallel);
            Console.WriteLine("Done.");

            Console.ReadLine();
        }
    }
}

标签: c#

解决方案


numbersFromParallel数组索引的计算是错误的。假设您的范围是从04没有-1偏移量(所以只有i*g)。然后您将生成以下值:

g=0 g=1 g=2 g=3 g=4
我=0 0 0 0 0 0
我=1 0 1 2 3 4
我=2 0 2 4 6 8
我=3 0 3 6 9 12
我=4 0 4 8 12 16

有很多跳过的数字(如510),有些值是重复的(如0312)。

你想要的是一个表达式,比如5*i + g获取如下值:

g=0 g=1 g=2 g=3 g=4
我=0 (0) 0 1 2 3 4
我=1 (5) 5 6 7 8 9
我=2 (10) 10 11 12 13 14
我=3 (15) 15 16 17 18 19
我=4 (20) 20 21 22 23 24

所以你必须像这样调整Parallel.For循环:

int count_x = 50;
int count_y = 10;    
string[] numbersFromParallel = new string[count_x*count_y];

// ...

Parallel.For(0, count_x, option1, i =>
{
    Parallel.For(0, count_y, option2, g =>
    {
        int index = i*count_y + g;      
        numbersFromParallel[index] = index.ToString();
    });
});

推荐阅读