private Task AddToQueue(TaskObject taskObject, bool taskWait = false) { QueuedTaskObjects.Add(taskObject); Log.Debug($"adding new taskobject to queue: {CallerName}"); TimeSpan delay = new TimeSpan(); if (taskWait) { taskObject.TaskScheduled.WaitOne(); } Log.Debug($"added new taskobject to queue:{CallerName} delay:{delay.TotalMilliseconds}ms"); return(taskObject.Task); }
private Task <object> ScheduleTaskFunction(TaskObject taskObject) { bool hasContinueWith = taskObject.ContinueWith != null; Log.Debug("scheduling function state continuewith"); CancellationToken token = new CancellationToken(); Task <object> task = Task.Factory.StartNew(taskObject.Func, null, token, CreationOptions, _customScheduler); if (hasContinueWith) { AllTasks.Add(task.ContinueWith(taskObject.ContinueWith, ContinuationOptions)); } Log.Debug($"scheduling action func scheduled:{task.Id} continuewith:{hasContinueWith} "); AllTasks.Add(task); return(task); }
private static int ManageTasks(CustomTaskManager instance) { if (instance.RemoveWhenComplete && instance.AllTasks.Any(x => x.IsCompleted)) { string taskUpdate = $"removing completed tasks from instance {instance.CallerName} " + $"scheduled:{instance.AllTasks.Count()} " + $"queued:{instance.QueuedTaskObjects.Count()}"; if (Config.LogDebug) { instance.AllTasks.ForEach(x => taskUpdate += $"\r\n ID:{x.Id.ToString().PadRight(6)} {x.Status.ToString().PadRight(15)} ({x.CreationOptions.ToString()})"); } Log.Info(taskUpdate, ConsoleColor.White); foreach (Task badTask in instance.AllTasks.FindAll(x => x.Status > TaskStatus.RanToCompletion)) { Log.Error("task failure: ", badTask); TotalErrors++; } instance.AllTasks.RemoveAll(x => x.IsCompleted); } while ((instance.CreationOptions == TaskCreationOptions.AttachedToParent | !instance.IsAboveQuota()) && instance.QueuedTaskObjects.Any()) { TaskObject taskObject = instance.QueuedTaskObjects[0]; instance.ScheduleTask(taskObject); instance.QueuedTaskObjects.Remove(taskObject); Log.Highlight($"scheduled task {instance.GetHashCode()} " + $"instance:{instance.CallerName} " + $"total:{instance.AllTasks.Count()} " + $"incomplete:{instance.AllTasks.Count(x => !x.IsCompleted)} " + $"queued:{instance.QueuedTaskObjects.Count()} " + $"GC:{GC.GetTotalMemory(false)} " + $"total records:{TotalRecords} " + $"rps:{TotalRecords / (DateTime.Now - StartTime).TotalSeconds}"); } return(instance.AllTasks.Count(x => !x.IsCompleted)); }
private void ScheduleTask(TaskObject taskObject) { if (taskObject.Action != null) { taskObject.Task = ScheduleTaskAction(taskObject); } else if (taskObject.ActionObject != null) { taskObject.Task = ScheduleTaskAction(taskObject.ActionObject, new object()); } else if (taskObject.Func != null) { taskObject.Task = ScheduleTaskFunction(taskObject); } else { Log.Error($"invalid taskObject: {CallerName}", taskObject); } taskObject.TaskScheduled.Set(); Log.Debug($"schedule task {CallerName} scheduled"); }