1 |
using System; |
2 |
using System.Collections.Generic; |
3 |
using System.Threading; |
4 |
using System.Threading.Tasks; |
5 |
|
6 |
namespace Oni |
7 |
{ |
8 |
internal static class Parallel |
9 |
{ |
10 |
public static void ForEach<T>(IEnumerable<T> items, Action<T> action) |
11 |
{ |
12 |
var array = items.ToArray(); |
13 |
|
14 |
if (array.Length == 0) |
15 |
{ |
16 |
return; |
17 |
} |
18 |
|
19 |
if (array.Length == 1) |
20 |
{ |
21 |
action(array[0]); |
22 |
return; |
23 |
} |
24 |
|
25 |
int cpuCount = Environment.ProcessorCount; |
26 |
|
27 |
if (cpuCount == 1) |
28 |
{ |
29 |
foreach (T item in array) |
30 |
action(item); |
31 |
|
32 |
return; |
33 |
} |
34 |
|
35 |
#if NETCORE |
36 |
var task = Task.Run(() => |
37 |
{ |
38 |
for (int i = array.Length / 2; i < array.Length; i++) |
39 |
action(array[i]); |
40 |
}); |
41 |
#else |
42 |
var thread = new Thread(() => |
43 |
{ |
44 |
for (int i = array.Length / 2; i < array.Length; i++) |
45 |
action(array[i]); |
46 |
}); |
47 |
|
48 |
thread.Start(); |
49 |
#endif |
50 |
|
51 |
for (int i = 0; i < array.Length / 2; i++) |
52 |
action(array[i]); |
53 |
|
54 |
#if NETCORE |
55 |
task.Wait(); |
56 |
#else |
57 |
thread.Join(); |
58 |
#endif |
59 |
} |
60 |
} |
61 |
} |