/// <summary> /// This is the constructor for the task manager. /// </summary> /// <param name="dispatcher">The dispatcher function that is used to process the specific tasks.</param> /// <param name="policy">The task manager policy.</param> public TaskManager(Func <TransmissionPayload, Task> dispatcher, TaskManager.Policy policy) : base(policy, nameof(TaskManager)) { if (policy == null) { throw new ArgumentNullException($"{nameof(TaskManager)}: policy can not be null"); } mPauseCheck = new ManualResetEventSlim(); mAvailability = new TaskAvailability(policy.PriorityLevels, policy.ConcurrentRequestsMax); mTasksQueue = new QueueTrackerContainer <QueueTracker>(policy.PriorityLevels); mProcessInternalQueue = new ConcurrentQueue <TaskTracker>(); mProcesses = new ConcurrentDictionary <string, TaskManagerProcessContext>(); Dispatcher = dispatcher ?? throw new ArgumentNullException($"{nameof(TaskManager)}: dispatcher can not be null"); if (!mPolicy.ProcessKillOverrunGracePeriod.HasValue) { mPolicy.ProcessKillOverrunGracePeriod = TimeSpan.FromSeconds(15); } mTaskRequests = new ConcurrentDictionary <Guid, TaskTracker>(); }