c# - 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();
}
}
}
解决方案
numbersFromParallel
数组索引的计算是错误的。假设您的范围是从0
到4
没有-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 |
有很多跳过的数字(如5
或10
),有些值是重复的(如0
、3
或12
)。
你想要的是一个表达式,比如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();
});
});
推荐阅读
- typescript - 具有泛型和部分的类上的打字稿错误
- php - Wordpress 子主题中的多个 css 文件
- swift - Alamofire 的 .responseString 方法有什么用?
- c# - Serilog 中范围的临时日志记录抑制
- javascript - 表格行中包含的输入字段存在问题,无法为它们设置值
- svg - 自定义嵌入的 SVG 字形不呈现
- javascript - 在同一组件中包装提供程序抛出元素类型无效:期望字符串(用于内置组件)或类/函数但得到:对象
- d - 附加到数组对象
- r - 在R中动态创建的S4类中循环变量
- java - 如何以正确的顺序收集和合并 Java Stream 中的不同对象?