forked from giacomelli/GeneticSharp
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathParallelTaskExecutor.cs
More file actions
138 lines (122 loc) · 4.95 KB
/
ParallelTaskExecutor.cs
File metadata and controls
138 lines (122 loc) · 4.95 KB
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
using System;
using System.Threading;
using System.Threading.Tasks;
namespace GeneticSharp
{
/// <summary>
/// An ITaskExecutor's implementation that executes the tasks in a parallel fashion.
/// </summary>
public class ParallelTaskExecutor : TaskExecutorBase
{
/// <summary>
/// Initializes a new instance of the
/// <see cref="T:GeneticSharp.Infrastructure.Framework.Threading.ParallelTaskExecutor"/> class.
/// </summary>
public ParallelTaskExecutor()
{
MinThreads = 200;
MaxThreads = 200;
}
/// <summary>
/// Initializes a new instance of the
/// <see cref="T:GeneticSharp.Infrastructure.Framework.Threading.ParallelTaskExecutor"/> class.
/// </summary>
/// <param name="cancellationToken">The cancellation token.</param>
public ParallelTaskExecutor(CancellationToken cancellationToken)
: base(cancellationToken)
{
MinThreads = 200;
MaxThreads = 200;
}
/// <summary>
/// Gets or sets the minimum threads.
/// </summary>
/// <value>The minimum threads.</value>
public int MinThreads { get; set; }
/// <summary>
/// Gets or sets the max threads.
/// </summary>
/// <value>The max threads.</value>
public int MaxThreads { get; set; }
/// <summary>
/// Gets or sets the cancellation token source.
/// </summary>
protected CancellationTokenSource CancellationTokenSource { get; set; }
/// <summary>
/// Starts the tasks execution.
/// </summary>
/// <returns>If has reach the timeout false, otherwise true.</returns>
public override bool Start()
{
SetThreadPoolConfig(out int minWorker, out int minIOC, out int maxWorker, out int maxIOC);
try
{
base.Start();
CancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(CancellationToken);
var token = CancellationTokenSource.Token;
var parallelTasks = new Task[Tasks.Count];
for (int i = 0; i < Tasks.Count; i++)
{
var task = Tasks[i];
parallelTasks[i] = Task.Run(async () => await task(token), token);
}
// Need to verify, because TimeSpan.MaxValue passed to Task.WaitAll throws a System.ArgumentOutOfRangeException.
if (Timeout == TimeSpan.MaxValue)
{
Task.WaitAll(parallelTasks);
return true;
}
return Task.WaitAll(parallelTasks, Timeout);
}
finally
{
ResetThreadPoolConfig(minWorker, minIOC, maxWorker, maxIOC);
CancellationTokenSource?.Dispose();
CancellationTokenSource = null;
IsRunning = false;
}
}
/// <summary>
/// Stops the tasks execution.
/// </summary>
public override void Stop()
{
base.Stop();
CancellationTokenSource?.Cancel();
IsRunning = false;
}
/// <summary>
/// Configure the ThreadPool min and max threads number to the define on this instance properties.
/// </summary>
/// <param name="minWorker">Minimum worker.</param>
/// <param name="minIOC">Minimum ioc.</param>
/// <param name="maxWorker">Max worker.</param>
/// <param name="maxIOC">Max ioc.</param>
protected void SetThreadPoolConfig(out int minWorker, out int minIOC, out int maxWorker, out int maxIOC)
{
// Do not change values if the new values to min and max threads are lower than already configured on ThreadPool.
ThreadPool.GetMinThreads(out minWorker, out minIOC);
if (MinThreads > minWorker)
{
ThreadPool.SetMinThreads(MinThreads, minIOC);
}
ThreadPool.GetMaxThreads(out maxWorker, out maxIOC);
if (MaxThreads > maxWorker)
{
ThreadPool.SetMaxThreads(MaxThreads, maxIOC);
}
}
/// <summary>
/// Rollback ThreadPool previous min and max threads configuration.
/// </summary>
/// <param name="minWorker">Minimum worker.</param>
/// <param name="minIOC">Minimum ioc.</param>
/// <param name="maxWorker">Max worker.</param>
/// <param name="maxIOC">Max ioc.</param>
protected static void ResetThreadPoolConfig(int minWorker, int minIOC, int maxWorker, int maxIOC)
{
ThreadPool.SetMinThreads(minWorker, minIOC);
ThreadPool.SetMaxThreads(maxWorker, maxIOC);
}
}
}