| 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 |
} |