I'm using parallel foreach/for loop, in particular case I need to go with nested parallel foreach/for loop. While I tried to print the values in my collection, sometimes console statements are not being printed which is not consistent. See the piece of code below.
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);
});
Collection:
Collection type is ConcurrentDictionary<string, HashSet>()
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"
]
}
Actual Output:
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
Expected Output: (Needn't be in same order)
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
Note: Output is not consistent. Sometimes able to see all sub-childs and sometimes not. How can I understand this, and what can be done to overcome this?