using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using JD.Interfaces.Composition; using JD.Interfaces.Composition.Units; namespace JD.Core { /// /// Manager handling task creation. This manager is able to overload tasks according to the framework components availability. /// public class TaskManager { static TaskManager() { Instance = new TaskManager(); } public static TaskManager Instance { get; } private readonly IEnumerable _availableOverloads; protected TaskManager() { _availableOverloads = Objects.GetAllInstances(); } public Task CreateTask(Action action) { return new Task(OverloadTask(action)); } public Task CreateTask(Action action, CancellationToken cancellationToken) { return new Task(OverloadTask(action), cancellationToken); } public Task CreateTask(Action action, TaskCreationOptions creationOptions) { return new Task(OverloadTask(action), creationOptions); } public Task CreateTask(Action action, CancellationToken cancellationToken, TaskCreationOptions creationOptions) { return new Task(OverloadTask(action), cancellationToken, creationOptions); } public Task CreateTask(Action action, object state) { return new Task(OverloadTask(action), state); } public Task CreateTask(Action action, object state, CancellationToken cancellationToken) { return new Task(OverloadTask(action), state, cancellationToken); } public Task CreateTask(Action action, object state, TaskCreationOptions creationOptions) { return new Task(OverloadTask(action), state, creationOptions); } public Task CreateTask(Action action, object state, CancellationToken cancellationToken, TaskCreationOptions creationOptions) { return new Task(OverloadTask(action), state, cancellationToken, creationOptions); } private Action OverloadTask(Action action) { foreach (var overload in _availableOverloads) { action = overload.OverloadTask(action); } return action; } private Action OverloadTask(Action action) { foreach (var overload in _availableOverloads) { action = overload.OverloadTask(action); } return action; } } }