【发布时间】:2025-12-27 07:00:12
【问题描述】:
我正在使用并行 foreach/for 循环,特别是我需要使用嵌套的并行 foreach/for 循环。当我尝试打印我的集合中的值时,有时控制台语句没有被打印,这是不一致的。请参阅下面的代码。
Parallel.For(0, RunModuleConfigVariables.Count, new ParallelOptions { MaxDegreeOfParallelism = 3 }, index => {
string log = null;
int count = 0;
log += "Module Name " + RunModuleConfigVariables.Keys.ElementAt(index) + " thread: " + Thread.CurrentThread.ManagedThreadId + "\n";
Parallel.ForEach(RunModuleConfigVariables[RunModuleConfigVariables.Keys.ElementAt(index)], new ParallelOptions { MaxDegreeOfParallelism = 10 }, eachendpoint => {
log += "\t" + count + " Endpoint Name " + eachendpoint + "\n";
count++;
});
Console.WriteLine(log);
});
收藏:
集合类型是ConcurrentDictionary
RunModuleConfigVariables:
{
"Module_1": [
"Module_1_Endpoint_1",
"Module_1_Endpoint_2",
"Module_1_Endpoint_3",
"Module_1_Endpoint_4",
"Module_1_Endpoint_5",
"Module_1_Endpoint_6",
"Module_1_Endpoint_7",
"Module_1_Endpoint_8",
"Module_1_Endpoint_9",
"Module_1_Endpoint_10",
"Module_1_Endpoint_11",
"Module_1_Endpoint_12",
"Module_1_Endpoint_13",
"Module_1_Endpoint_14",
"Module_1_Endpoint_15",
"Module_1_Endpoint_16",
"Module_1_Endpoint_17",
"Module_1_Endpoint_18",
"Module_1_Endpoint_19"
],
"Module_2": [
"Module_2_Endpoint_1",
"Module_2_Endpoint_2",
"Module_2_Endpoint_3"
],
"Module_3": [
"Module_3_Endpoint_1"
]
}
实际输出:
Module Name Module_1 thread: 4
0 Endpoint Name Module_1_Endpoint_2
1 Endpoint Name Module_1_Endpoint_1
2 Endpoint Name Module_1_Endpoint_4
3 Endpoint Name Module_1_Endpoint_5
4 Endpoint Name Module_1_Endpoint_6
5 Endpoint Name Module_1_Endpoint_7
6 Endpoint Name Module_1_Endpoint_8
18 Endpoint Name Module_1_Endpoint_9
Module Name Module_3 thread: 5
0 Endpoint Name Module_3_Endpoint_1
Module Name Module_2 thread: 1
0 Endpoint Name Module_2_Endpoint_2
1 Endpoint Name Module_2_Endpoint_3
2 Endpoint Name Module_2_Endpoint_1
预期输出:(不需要相同的顺序)
Module Name Module_1 thread: 5
0 Endpoint Name Module_1_Endpoint_2
1 Endpoint Name Module_1_Endpoint_3
2 Endpoint Name Module_1_Endpoint_4
3 Endpoint Name Module_1_Endpoint_5
4 Endpoint Name Module_1_Endpoint_6
5 Endpoint Name Module_1_Endpoint_7
6 Endpoint Name Module_1_Endpoint_8
7 Endpoint Name Module_1_Endpoint_9
8 Endpoint Name Module_1_Endpoint_10
9 Endpoint Name Module_1_Endpoint_11
10 Endpoint Name Module_1_Endpoint_12
11 Endpoint Name Module_1_Endpoint_13
12 Endpoint Name Module_1_Endpoint_14
13 Endpoint Name Module_1_Endpoint_15
14 Endpoint Name Module_1_Endpoint_16
15 Endpoint Name Module_1_Endpoint_17
16 Endpoint Name Module_1_Endpoint_18
17 Endpoint Name Module_1_Endpoint_19
18 Endpoint Name Module_1_Endpoint_1
Module Name Module_2 thread: 4
0 Endpoint Name Module_2_Endpoint_2
1 Endpoint Name Module_2_Endpoint_3
2 Endpoint Name Module_2_Endpoint_1
Module Name Module_3 thread: 1
0 Endpoint Name Module_3_Endpoint_1
注意:输出不一致。有时能够看到所有子孩子,有时则不能。我如何理解这一点,以及如何克服这一点?
【问题讨论】:
标签: .net c#-4.0 parallel.foreach parallel.for