JD2022-TU1/main/tools/framework/JD.Core/TaskManager.cs

86 lines
2.7 KiB
C#

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
{
/// <summary>
/// Manager handling task creation. This manager is able to overload tasks according to the framework components availability.
/// </summary>
public class TaskManager
{
static TaskManager()
{
Instance = new TaskManager();
}
public static TaskManager Instance { get; }
private readonly IEnumerable<ITaskOverload> _availableOverloads;
protected TaskManager()
{
_availableOverloads = Objects.GetAllInstances<ITaskOverload>();
}
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<object> action, object state)
{
return new Task(OverloadTask(action), state);
}
public Task CreateTask(Action<object> action, object state, CancellationToken cancellationToken)
{
return new Task(OverloadTask(action), state, cancellationToken);
}
public Task CreateTask(Action<object> action, object state, TaskCreationOptions creationOptions)
{
return new Task(OverloadTask(action), state, creationOptions);
}
public Task CreateTask(Action<object> 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<object> OverloadTask(Action<object> action)
{
foreach (var overload in _availableOverloads)
{
action = overload.OverloadTask(action);
}
return action;
}
}
}