コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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));
        }
コード例 #4
0
        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");
        }